1. vector基础概念与核心优势
vector是C++标准模板库(STL)中最常用的序列式容器之一,本质上是一个动态数组的类模板实现。与普通数组相比,它的核心优势在于能够动态管理内存,自动处理元素的增删操作。我在实际项目中使用vector的频率远高于原生数组,特别是在需要频繁修改数据规模的场景下。
vector的模板特性意味着它可以存储任意类型的元素,从基本数据类型(int, double等)到自定义类对象。这一点与string不同,string是专门为字符数据设计的特化版本。例如我们可以这样定义不同类型的vector:
cpp复制vector<int> intVec; // 整型数组
vector<string> strVec; // 字符串数组
vector<MyClass> objVec; // 自定义类对象数组
vector内部通过连续的存储空间存放元素,这意味着它支持随机访问(通过下标操作符[]),时间复杂度为O(1)。这种特性使得vector在需要频繁按索引访问元素的场景下表现优异。
2. vector的构造与初始化
2.1 构造函数详解
vector提供了多种构造函数以适应不同的初始化需求:
-
默认构造函数:创建一个空vector
cpp复制vector<int> v1; // 空vector,容量为0 -
填充构造函数:创建包含n个相同元素的vector
cpp复制vector<int> v2(5, 10); // 包含5个10的vector -
范围构造函数:通过迭代器范围初始化
cpp复制int arr[] = {1,2,3,4,5}; vector<int> v3(arr, arr+5); // 用数组初始化 -
拷贝构造函数:通过另一个vector初始化
cpp复制vector<int> v4(v3); // v4是v3的副本
注意:使用范围构造函数时,迭代器类型必须匹配。例如不能用list的迭代器直接初始化vector,除非元素类型兼容。
2.2 初始化最佳实践
在实际编码中,我推荐使用C++11引入的统一初始化语法:
cpp复制vector<int> v{1,2,3,4,5}; // 直接初始化元素
这种方式代码更简洁,可读性更强。对于大型数据集,可以先reserve空间再逐个添加元素,避免多次内存重分配:
cpp复制vector<BigObject> bigVec;
bigVec.reserve(1000); // 预分配空间
for(int i=0; i<1000; ++i) {
bigVec.emplace_back(/*构造参数*/);
}
3. 迭代器使用与遍历技巧
3.1 迭代器类型与基本操作
vector支持多种迭代器类型,每种都有其特定用途:
-
正向迭代器:
cpp复制vector<int>::iterator it = v.begin(); vector<int>::const_iterator cit = v.cbegin(); // 只读版本 -
反向迭代器:
cpp复制vector<int>::reverse_iterator rit = v.rbegin();
迭代器的典型遍历方式:
cpp复制for(auto it =
