C++ STL vector容器详解:从原理到实践
引言
亲爱的小伙伴们,今天我要和大家分享一个C++编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性,又能自动调整大小,让你告别固定大小数组的困扰。不管你是刚接触C++的新手,还是想深入理解vector实现原理的老手,这篇博客都能带给你新的收获!
一、什么是vector?
想象一下,你正在收集各种小玩具,但不确定最终会有多少个。用普通数组的话,你得提前决定一个上限,太小了不够用,太大了又浪费空间。这时候,vector就像一个神奇的收纳盒,它能根据你放入的玩具数量自动调整大小!
定义与特点
- 动态数组:vector是一个能够存放任意类型的动态数组
- 连续内存:vector中的元素在内存中连续存储,支持高效的随机访问
- 自动扩容:当空间不足时,vector会自动分配更大的内存空间
- 类型安全:通过模板机制确保类型安全
vector的内部结构
从实现原理上看,vector内部维护三个关键指针:
指向数据的起始位置 —— start
指向最后一个元素的下一个位置 —— finish
指向分配的内存空间的尾端 —— end_of_storage
!vector内部结构示意图
这就像一个能伸缩的宿舍:
- start是宿舍的门口
- finish是最后一名同学睡的床位后面一点的位置
- end_of_storage是宿舍的墙壁(容量上限)
二、vector的基本操作
创建vector
#include // 创建空vector std::vector vec1; // 创建包含5个元素的vector,所有元素初始化为0 std::vector vec2(5); // 创建包含5个元素的vector,所有元素初始化为10 std::vector vec3(5, 10); // 使用初始化列表(C++11) std::vector vec4 = {1, 2, 3, 4, 5}; // 从数组创建vector int arr[] = {1, 2, 3, 4, 5}; std::vector vec5(arr, arr + 5); // 从另一个vector创建 std::vector vec6(vec5);
这就像不同的方式开party:可以先空着等人来(vec1),可以先邀请5个人(vec2),可以先邀请5个特定的朋友(vec3)...
添加和删除元素
std::vector vec; // 在尾部添加元素 vec.push_back(10); // 添加元素10到尾部 // 在指定位置插入元素 vec.insert(vec.begin() + 1, 20); // 在第二个位置插入20 // 删除尾部元素 vec.pop_back(); // 删除指定位置的元素 vec.erase(vec.begin() + 1); // 删除第二个元素 // 清空所有元素 vec.clear();
想象一下排队买票:
- push_back是有人来排队,自动站到队尾
- insert是有人插队到指定位置
- pop_back是最后一个人不想排了,离开了
- erase是队伍中间某个人离开了
- clear是突然下大雨,所有人都散了
访问元素
std::vector vec = {10, 20, 30, 40, 50}; // 使用索引访问 int a = vec[2]; // 获取索引为2的元素(30) // 使用at函数(带边界检查) int b = vec.at(3); // 获取索引为3的元素(40),越界会抛出异常 // 获取第一个和最后一个元素 int first = vec.front(); // 获取第一个元素(10) int last = vec.back(); // 获取最后一个元素(50)
这就像找教室里的同学:直接叫号(索引)、点名确认(at)、找第一个和最后一个。
三、vector的容量管理
理解vector的容量管理是掌握其高效使用的关键。
size与capacity
- size:当前vector中实际元素的个数
- capacity:当前vector在不扩容的情况下最多能容纳的元素个数
std::vector vec; for(int i = 0; i
- capacity:当前vector在不扩容的情况下最多能容纳的元素个数
- size:当前vector中实际元素的个数
- clear是突然下大雨,所有人都散了
- erase是队伍中间某个人离开了
- pop_back是最后一个人不想排了,离开了
- insert是有人插队到指定位置
- push_back是有人来排队,自动站到队尾
- end_of_storage是宿舍的墙壁(容量上限)
- finish是最后一名同学睡的床位后面一点的位置
- start是宿舍的门口
- 类型安全:通过模板机制确保类型安全
- 自动扩容:当空间不足时,vector会自动分配更大的内存空间
- 连续内存:vector中的元素在内存中连续存储,支持高效的随机访问
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。