【C++ STL】vector容器详解:从入门到精通
摘要:本文深入讲解C++ STL中vector
容器的使用方法,涵盖常用函数、代码示例及注意事项,助你快速掌握动态数组的核心操作!
一、vector概述
vector
是C++标准模板库(STL)中序列容器的代表,本质上是一个动态数组。它能够根据需要自动调整大小,支持快速随机访问,在尾部插入/删除元素效率极高,是C++中最常用的容器之一。
核心特性:
- 动态扩容:内存空间自动增长(默认翻倍策略)
- 连续存储:元素内存连续,支持指针偏移访问
- 随机访问:O(1)时间复杂度访问任意元素
- 尾部操作高效:push_back/pop_back的时间复杂度为O(1)
二、vector常用函数详解
1. 构造函数
vector<int> v1; // 空vector
vector<int> v2(5, 100); // 5个100
vector<int> v3(v2.begin(), v2.end()); // 迭代器构造
vector<int> v4(v3); // 拷贝构造// C++11初始化列表
vector<int> v5 = {1,2,3,4,5};
2. 元素访问
函数 | 说明 | 示例 |
---|---|---|
[] | 随机访问(不检查越界) | v[2] = 5; |
at() | 带边界检查的访问 | v.at(3) = 10; |
front() | 首元素 | int a = v.front(); |
back() | 尾元素 | int b = v.back(); |
data() | 返回指向数组的指针(C++11) | int* p = v.data(); |
3. 容量操作
v.empty(); // 判断是否为空
v.size(); // 当前元素个数
v.capacity(); // 当前分配的存储容量
v.reserve(100); // 预分配至少100个元素的空间
v.resize(10); // 调整元素个数为10(默认填充0)
v.shrink_to_fit(); // 请求移除未使用的容量(C++11)
4. 修改操作
尾部操作:
v.push_back(10); // 尾部插入元素
v.emplace_back(20); // 更高效的尾部构造(C++11)
v.pop_back(); // 删除最后一个元素
插入删除:
v.insert(v.begin()+2, 100); // 在第三个位置插入100
v.emplace(v.begin(), 50); // 构造插入(C++11)
v.erase(v.begin()+1); // 删除第二个元素
v.erase(v.begin(), v.begin()+3); // 删除前三个元素
v.clear(); // 清空所有元素
交换内容:
vector<int> v6 = {6,7,8};
v.swap(v6); // 交换两个vector的内容
三、vector遍历方式
1. 下标遍历
for(size_t i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}
2. 迭代器遍历
for(auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
3. 范围for循环(C++11)
for(int num : v) {cout << num << " ";
}
四、实战示例代码
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec;// 添加元素for(int i=0; i<5; ++i){vec.push_back(i*10);} // vec: 0 10 20 30 40// 中间插入vec.insert(vec.begin()+2, 25); // 0 10 25 20 30 40// 删除元素vec.pop_back(); // 移除40vec.erase(vec.begin()); // 移除0 → 10 25 20 30// 修改元素vec[1] = 250; // 10 250 20 30// 容量操作cout << "Capacity: " << vec.capacity() << endl; // 8vec.shrink_to_fit();cout << "New capacity: " << vec.capacity() << endl; //4// 遍历输出for(int num : vec) {cout << num << " ";}return 0;
}
输出结果:
Capacity: 8
New capacity: 4
10 250 20 30
五、注意事项
-
迭代器失效:
- 插入元素可能导致所有迭代器失效(扩容时)
- 删除元素会使被删元素之后的迭代器失效
-
性能优化:
- 使用
reserve()
预分配空间避免频繁扩容 - 优先选择
emplace_back()
而非push_back()
- 使用
-
特殊类型:
vector<bool>
是特化版本,每个元素占1bit,行为可能与其他类型不同
-
内存管理:
clear()
只清空元素,不释放内存- 结合
shrink_to_fit()
可真正释放多余内存(C++11)
六、总结
vector
凭借其高效的随机访问和动态扩展特性,成为处理动态数组需求的首选容器。合理使用reserve预分配、选择正确的插入方法,可以显著提升程序性能。掌握vector的各种操作,将为你的C++编程打下坚实基础!