std::vector
是C++标准模板库(STL)中最常用的动态数组容器,相比原始数组和链表具有显著优势:
特性 | std::vector | 原始数组 | 链表 |
---|---|---|---|
动态大小 | ✅ 自动扩容 | ❌ 固定大小 | ✅ 动态增长 |
内存局部性 | ✅ 连续存储 | ✅ 连续存储 | ❌ 非连续 |
随机访问 | ✅ O(1) | ✅ O(1) | ❌ O(n) |
插入/删除效率 | 尾部O(1),中部O(n) | ❌ 不支持 | ✅ O(1) |
典型应用场景:
需要频繁随机访问元素
不确定元素数量的情况
作为函数返回值或参数传递
替代原始数组的现代C++做法
#include // 必须包含的头文件
// 基本声明方式
std::vector vec1; // 空vector
std::vector vec2; // 字符串vector
连续内存:所有元素存储在连续内存块中
自动扩容:当容量不足时自动重新分配内存(通常2倍增长)
类型安全:编译时类型检查
// 默认构造
std::vector v1;
// 指定初始大小和值
std::vector v2(10); // 10个0
std::vector v3(10, 42); // 10个42
// 列表初始化(C++11)
std::vector v4 {1, 2, 3};
// 从数组构造
int arr[] = {4, 5, 6};
std::vector v5(arr, arr + 3);
// 拷贝构造
std::vector v6(v5);
std::vector v = {10, 20, 30};
// 不安全但快速的访问
int a = v[1]; // 20,不检查边界
// 安全的访问(越界抛出异常)
int b = v.at(2); // 30
// 首尾元素
int first = v.front(); // 10
int last = v.back(); // 30
// 数据指针(兼容C API)
int* p = v.data();
// 常规迭代
for(auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
// 现代C++范围for
for(const auto& val : v) {
std::cout << val << " ";
}
// 反向迭代
for(auto rit = v.rbegin(); rit != v.rend(); ++rit) {
std::cout << *rit << " ";
}
std::vector v = {1, 2, 3};
// 尾部添加(高效)
v.push_back(4); // 1,2,3,4
v.emplace_back(5); // 直接构造,避免拷贝(C++11)
// 中间插入(低效)
v.insert(v.begin() + 1, 9); // 1,9,2,3,4,5
// 删除元素
v.erase(v.begin()); // 9,2,3,4,5
v.pop_back(); // 9,2,3,4
// 清空vector
v.clear();
// 批量插入
std::vector source = {7, 8, 9};
v.insert(v.end(), source.begin(), source.end());
// 移动语义避免拷贝(C++11)
std::string s = "example";
v.emplace_back(std::move(s)); // s现在为空
std::vector v;
// 元素数量
size_t count = v.size();
// 实际分配的内存容量
size_t cap = v.capacity();
// 预分配内存(避免多次扩容)
v.reserve(100);
// 调整大小(新增元素用0填充)
v.resize(50);
// 释放多余内存
v.shrink_to_fit(); // 容量可能减少到等于size
vector的扩容通常遵循2倍增长策略,但标准未严格规定:
std::vector v;
for(int i=0; i<1000; ++i) {
v.push_back(i);
if(v.size() == v.capacity()) {
std::cout << "Capacity changed to: " << v.capacity() << std::endl;
}
}
预分配内存:已知大小时先用reserve()
std::vector v;
v.reserve(1000); // 避免多次重新分配
使用emplace_back:避免临时对象构造
v.emplace_back(10, "text"); // 直接构造元素
移动而非拷贝:对大对象使用std::move
std::vector words;
std::string largeStr = getLargeString();
words.push_back(std::move(largeStr)); // 转移所有权
交换技巧清空vector:
std::vector().swap(v); // 快速清空并释放内存
std::vector是C++中最重要且高效的动态数组容器,它将原始数组的连续存储优势与现代C++的自动内存管理完美结合。作为标准库中使用最频繁的容器,vector支持快速随机访问(O(1)时间复杂度),提供自动扩容机制,并通过模板化实现支持任意数据类型。其核心优势包括:内存局部性带来的缓存友好性、丰富的成员函数(push_back/emplace_back等)、与STL算法的无缝集成,以及通过reserve()实现的性能优化。无论是作为函数参数传递、存储动态数据集,还是替代传统数组,vector都是现代C++开发中的首选容器。掌握其容量管理、迭代器使用和高效插入技巧,将显著提升代码质量和运行效率。