一、vector简介
vector是C++标准模板库(STL)中最常用的序列式容器之一,它提供动态数组的功能,能够自动管理内存,在运行时根据需要动态调整大小。
vector的核心特性:
-
动态数组:底层实现为动态分配的连续内存空间
-
快速随机访问:支持通过下标直接访问元素(时间复杂度O(1))
-
尾部高效操作:在末尾插入/删除元素效率高(平均O(1))
-
自动扩容:当容量不足时自动分配更大的内存空间
-
类型安全:模板类,支持存储任意类型的数据
二、vector的基本使用
1. 头文件与声明
#include <vector>// 基本声明方式 std::vector<int> intVec; // 空vector std::vector<double> doubleVec(5); // 包含5个0.0的vector std::vector<std::string> strVec = {"Hello", "World"}; // 初始化列表
2. 常用构造函数
vector(); // 默认构造,创建空vector vector(size_type n); // 创建包含n个默认初始化元素的vector vector(size_type n, const T& val); // 创建包含n个值为val的元素的vector vector(const vector& other); // 拷贝构造函数 vector(initializer_list<T> il); // 初始化列表构造(C++11)
三、vector的迭代器与元素访问
1. 迭代器相关函数
begin()与end()
std::vector<int> vec = {1, 2, 3, 4, 5};// begin()返回指向第一个元素的迭代器 auto itBegin = vec.begin();// end()返回指向最后一个元素后面的位置的迭代器 auto itEnd = vec.end();// 遍历vector for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " "; }
rbegin()与rend() (反向迭代器)
// 反向遍历 for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {std::cout << *rit << " "; }
cbegin()与cend() (C++11 const迭代器)
// const迭代器,不能用于修改元素 for (auto cit = vec.cbegin(); cit != vec.cend(); ++cit) {std::cout << *cit << " "; }
2. 元素访问函数
front()与back()
std::vector<int> vec = {10, 20, 30};// front()返回第一个元素的引用 int& first = vec.front(); // first = 10// back()返回最后一个元素的引用 int& last = vec.back(); // last = 30
operator[]与at()
// operator[]不进行边界检查(更高效) int second = vec[1]; // 20// at()进行边界检查,越界时抛出std::out_of_range异常 int third = vec.at(2); // 30
data() (C++11)
// 返回指向底层数组的指针 int* p = vec.data();
四、vector的修改操作
1. insert()函数
insert()函数用于在指定位置插入元素,有多种重载形式:
std::vector<int> vec = {1, 2, 3};// 在指定位置插入单个元素 auto it = vec.insert(vec.begin() + 1, 99); // vec: {1, 99, 2, 3}, it指向新插入的99// 在指定位置插入n个相同元素 vec.insert(vec.end(), 3, 100); // vec: {1, 99, 2, 3, 100, 100, 100}// 在指定位置插入另一个容器的元素范围 std::vector<int> other = {7, 8, 9}; vec.insert(vec.begin(), other.begin(), other.end()); // vec: {7, 8, 9, 1, 99, 2, 3, 100, 100, 100}// 使用初始化列表插入(C++11) vec.insert(vec.end(), {200, 300}); // vec: {7, 8, 9, 1, 99, 2, 3, 100, 100, 100, 200, 300}
2. push_back()与emplace_back()
// push_back()在末尾添加元素(拷贝或移动) vec.push_back(500);// emplace_back()直接在容器末尾构造元素(更高效,C++11) vec.emplace_back(600);
3. erase()与clear()
// 删除单个元素 vec.erase(vec.begin() + 2); // 删除第三个元素// 删除元素范围 vec.erase(vec.begin() + 1, vec.begin() + 4);// 清空vector vec.clear();
4. pop_back()
// 删除最后一个元素 vec.pop_back();
五、vector的容量操作
1. size()与capacity()
std::vector<int> vec = {1, 2, 3};std::cout << "size: " << vec.size(); // 当前元素数量: 3 std::cout << "capacity: " << vec.capacity(); // 当前容量(可存储元素数量)
2. resize()与reserve()
// resize()改变元素数量 vec.resize(5); // 增加两个0 vec.resize(2); // 删除最后一个元素// reserve()预分配内存 vec.reserve(100); // 提前分配至少能容纳100个元素的内存
3. empty()
if (vec.empty()) {std::cout << "Vector is empty"; }
六、vector的性能与使用建议
-
预分配内存:如果知道大致大小,使用reserve()减少重新分配次数
-
优先使用emplace_back:比push_back更高效,避免不必要的拷贝
-
谨慎使用insert:在非尾部位置插入会导致元素移动,性能较低
-
迭代器失效:插入/删除操作可能导致迭代器失效,需要重新获取
-
vector<bool>的特殊性:标准库对bool类型有特化,行为与其他vector不同