目录
编辑
引言
一、初识vector:构造与初始化
二、动态管理:添加与删除元素
三、访问与遍历:多种方式直达元素
四、容量与大小:动态调整的艺术
五、进阶技巧:高效运用vector
结语
引言
在C++编程的世界里,std::vector
容器犹如一名全能选手,以其独特的魅力在众多容器中脱颖而出。作为STL(标准模板库)的明星成员,vector
不仅继承了数组的高效随机访问特性,还融合了动态内存管理的灵活性,成为处理可变大小序列数据的首选工具。本文将带领大家深入探索vector
的奥秘,通过丰富的代码示例,揭示其强大功能背后的设计哲学。
一、初识vector:构造与初始化
vector
容器的核心优势在于其能够根据需要自动调整大小,同时保持元素的连续存储,从而实现高效访问。
代码示例1:基础构造
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums; // 默认构造,创建空vector
std::vector<char> chars(5, 'A'); // 填充构造,创建含有5个'A'的vector
std::vector<double> fromArray({3.14, 2.71}); // 初始化列表构造
return 0;
}
二、动态管理:添加与删除元素
- push_back():在vector末尾添加元素。
- insert():在指定位置插入元素,可能导致迭代器失效。
- pop_back():删除vector末尾的元素。
- erase():删除指定位置的元素或一段区间。
代码示例2:元素操作
std::vector<int> numbers = {1, 2, 3};
numbers.push_back(4); // 添加元素到末尾
numbers.insert(numbers.begin() + 1, 5); // 在指定位置插入
numbers.pop_back(); // 删除最后一个元素
numbers.erase(numbers.begin() + 2); // 删除特定位置元素
三、访问与遍历:多种方式直达元素
- 下标访问:
v[i]
,快速直接。 - at():提供边界检查的安全访问。
- 迭代器:支持STL算法,实现遍历。
代码示例3:访问与遍历
for(int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
// 或使用迭代器
for(auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
四、容量与大小:动态调整的艺术
- size():返回当前元素数量。
- capacity():返回当前分配的内存容量。
- resize():调整vector大小,可选填充值初始化新元素。
- reserve():预分配内存,避免频繁重分配。
代码示例4:容量管理
numbers.resize(10, -1); // 调整大小至10,新增元素初始化为-1
numbers.reserve(20); // 预留至少20个元素的内存空间
五、进阶技巧:高效运用vector
- 数据迁移与交换:
swap()
函数高效地交换两个vector的内容。 - 内存释放:动态分配的内存会在vector析构时自动释放。
- 异常安全:理解在插入和删除操作中迭代器的失效规则,编写健壮代码。
代码示例5:高级操作
std::vector<int> anotherVec = {10, 20};
numbers.swap(anotherVec); // 交换两个vector
结语
std::vector
不仅是C++编程中的瑞士军刀,更是现代软件开发中不可或缺的工具。通过本文的介绍与实践,希望能帮助你更深入地理解vector
的强大之处,灵活运用其特性,提升代码的效率与优雅。无论是处理大数据集、构建高效算法,还是日常开发任务,掌握vector
的精髓都将使你的编程之旅更加顺畅。继续探索,让C++的魔力在你的指尖绽放!