std::vector
std::vector
是一个定义在 C++标准模板库(STL)中的标准容器,是最常用的容器之一。本质上,vector
是一个动态数组,当容量不足时会自动向外进行拓展,并提供了强大的功能来操作其存储的元素。 同时,得益于c++强大的模板功能,其可以存储任意类型的元素,包括基础数据类型,类类型,以及用户自定义的数据类型!
特点
vector
与数组一样,在内存中是连续存储的布局,因此可以通过索引或指针来像数组一样访问其中的元素,且vector还提供了随机访问迭代器。- 是动态容器,用户可以手动修改其大小,当容量不足时也可自动向外拓展。
- 模板支持,其可以适应多种数据类型。
- 用户可以指定该容器的内存分配策略,可以使用内存池来提高内存分配效率。
vector
容器因为连续内存布局的缘由,对于随机访问以及插入与删除操作(仅在尾部)的性能为常数时间复杂度 O(1)。其余情况下操作均为线性时间复杂度 O(n)。
vector
容器包含在<vector>头文件中,以下是该容器的一个简单运用示例:
void function() {
std::vector<int> vec; //默认构造一个空的vector对象
vec.push_back(5);
vec.push_back(9); //向vector中添加元素
vec.pop_back(); //弹出vector中的最后一个元素
//遍历vector中的元素
for(auto it = vec.begin() ; it != vec.end() ; ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
支持的迭代器类型
- 随机访问迭代器用于遍历和修改其中的元素。它支持随机访问,可以使用算术运算符(如
+
、-
、++
、--
等)进行操作。 - 常量迭代器用于遍历其中的元素,但不能修改元素的值。它也支持随机访问。
- 反向迭代器用于反向遍历其中的元素。它支持随机访问。
- 常量反向迭代器用于反向遍历其中的元素,但不能修改元素的值。它也支持随机访问。
void function8() {
std::vector<std::string> vec = {"Kate" , "Tom" , "Jerry"};
auto it = std::vector<std::string>::iterator(vec.begin()); //随机访问迭代器
std::cout << "Third Element: " << *(it+2) << std::endl;
std::cout << "Second Element: " << *(++it) << std::endl;
auto it1 = std::vector<std::string>::reverse_iterator(vec.rbegin()); //逆向迭代器
for( ; it1 != vec.rend() ; ++it1) {
std::cout << *it1 << " ";
}
std::cout << std::endl;
}
//Output:
//Third Element: Jerry
//Second Element: Tom
//Jerry Tom Kate
构造与初始化
- 默认构造:创建一个空的
vector
容器。 - 指定大小的构造:创建一个提前指定大小的
vector
。所以元素初始化为默认值。 - 指定大小和初值的构造:创建一个提前指定大小,使用用户所给值填充的
vector
。 - 迭代器范围构造:使用其他容器或数组的迭代器范围来初始化
vector
。