C++向量容器完全指南
·
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
// 1. 初始化与基本操作
std::vector<int> nums = {3, 1, 4, 1, 5}; // 初始化
nums.push_back(9); // 尾部插入
nums.pop_back(); // 尾部删除
// 2. 内存管理
std::cout << "容量: " << nums.capacity() << std::endl; // 预分配空间
nums.shrink_to_fit(); // 释放多余内存
// 3. 迭代器遍历
for (auto it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << " ";
}
// 4. 算法集成
std::sort(nums.begin(), nums.end()); // 快速排序
auto pos = std::find(nums.begin(), nums.end(), 4); // 查找元素
// 5. 高级技巧
std::vector<std::vector<int>> matrix(3, std::vector<int>(4, 0)); // 二维动态数组
}
核心特性解析
-
动态扩容
- 初始容量为0,添加元素时按指数级增长(通常$2^n$)
capacity()获取预分配空间,size()获取实际元素数
-
内存控制
vector<int> v; v.reserve(1000); // 预分配空间,避免频繁扩容使用
emplace_back()直接构造元素,减少临时对象复制:v.emplace_back(42); // 优于 push_back(42) -
迭代器失效
操作类型 失效情况 push_back()可能引起全部迭代器失效 insert()插入点之后迭代器失效 erase()被删元素之后迭代器失效 -
性能对比
操作 时间复杂度 说明 随机访问 $O(1)$ 连续内存优势 尾部插入 $O(1)$ 均摊复杂度 中间插入 $O(n)$ 需移动后续元素
最佳实践
-
优先用
range-based for循环:for (const auto& num : nums) { // 安全遍历 } -
避免
vector<bool>特化版,改用deque<bool>或bitset -
移动语义优化大对象传输:
std::vector<Matrix> data; data.push_back(Matrix(1000,1000)); // 触发复制构造 data.push_back(std::move(Matrix(1000,1000))); // 移动构造
应用场景
- 动态数据集:替代原生数组,自动管理内存
- 中间结果存储:算法处理的临时容器
- 矩阵表示:嵌套实现二维结构(需注意内存局部性)
通过
data()成员函数可直接访问底层数组:int* raw_ptr = nums.data(); // C++11起支持
更多推荐
所有评论(0)