1 包含头文件和命名空间
- 首先,在使用
vector
之前,需要包含<vector>
头文件。在 C++ 中,如果使用标准命名空间,还需要加上using namespace std;
语句(不过这种全局使用命名空间的方式在大型项目中可能会引起命名冲突,也可以只使用std::vector
来明确指定是标准库中的vector
类型)。
- 示例:
#include <vector>
// using namespace std;(可选择使用)
2 声明和初始化
- 默认初始化:
- 可以声明一个空的
vector
,其元素类型为T
(T
可以是任何数据类型,如int
、double
、string
等)。
- 示例:
std::vector<int> v;
,这里v
是一个空的vector
,用于存储int
类型的元素。
- 指定大小初始化:
- 可以创建一个具有指定大小的
vector
,并可以选择为每个元素提供初始值。
- 示例:
std::vector<int> v(n);
,这里v
是一个包含n
个元素的vector
,每个元素会被默认初始化(对于基本数据类型,如int
,会被初始化为 0)。如果要初始化为特定的值,可以使用std::vector<int> v(n, value);
,这里v
的n
个元素都会被初始化为value
(例如std::vector<int> v(5, 10);
会创建一个包含 5 个元素且每个元素都是 10 的vector
)。
- 从已有容器初始化:
- 可以使用另一个相同类型的容器(如另一个
vector
)来初始化新的vector
。
- 示例:
std::vector<int> v1 = {1, 2, 3}; std::vector<int> v2(v1);
,这里v2
会被初始化为与v1
相同的内容,包含 3 个元素 1、2、3。
- 使用迭代器初始化(高级用法):
- 可以使用迭代器范围来初始化
vector
,通常用于从一个已有的数据序列(如数组或其他容器的一部分)来创建vector
。
- 示例:
int arr[] = {1, 2, 3, 4, 5}; std::vector<int> v(arr, arr + 5);
,这里v
会被初始化为包含数组arr
中的 5 个元素。
3 访问元素
- 使用
[]
运算符:
- 可以通过
[]
运算符来访问vector
中的元素,类似于访问数组元素。需要注意的是,这种方式不进行边界检查,如果访问的索引超出范围,会导致未定义行为。
- 示例:
std::vector<int> v = {1, 2, 3}; int element = v[1];
,这里element
会获取v
中的第二个元素(索引为 1),值为 2。
- 使用
at()
方法:
at()
方法与[]
运算符类似,但它会进行边界检查,如果索引超出范围,会抛出std::out_of_range
异常。
- 示例:
std::vector<int> v = {1, 2, 3}; try { int element = v.at(3); } catch (std::out_of_range& e) { std::cerr << "Index out of range: " << e.what() << std::endl; }
,这里访问索引为 3 的元素,由于超出了v
的范围(v
只有 3 个元素,索引范围是 0 - 2),会抛出异常并被捕获处理。
4 添加和删除元素
- 添加元素:
push_back()
方法:在vector
的末尾添加一个元素。
- 示例:
std::vector<int> v; v.push_back(1); v.push_back(2);
,这里会在v
的末尾依次添加 1 和 2 两个元素,v
最终会包含两个元素 1 和 2。
insert()
方法(高级用法):可以在指定位置插入一个或多个元素。
- 示例:
std::vector<int> v = {1, 3}; v.insert(v.begin() + 1, 2);
,这里v.begin() + 1
表示在索引为 1 的位置(第二个元素之前)插入元素 2,v
最终会包含 1、2、3 三个元素。
- 删除元素:
pop_back()
方法:删除vector
末尾的一个元素。
- 示例:
std::vector<int> v = {1, 2, 3}; v.pop_back();
,这里会删除v
末尾的元素 3,v
最终会包含 1 和 2 两个元素。
erase()
方法(高级用法):可以删除指定位置的一个或多个元素。
- 示例:
std::vector<int> v = {1, 2, 3, 4}; v.erase(v.begin() + 1);
,这里v.begin() + 1
表示删除索引为 1 的元素(第二个元素),v
最终会包含 1、3、4 三个元素。
5 获取向量的属性
size()
方法:返回vector
中元素的个数。
- 示例:
std::vector<int> v = {1, 2, 3}; std::cout << v.size() << std::endl;
,这里会输出 3,表示v
中有 3 个元素。
empty()
方法:检查vector
是否为空,返回true
或false
。
- 示例:
std::vector<int> v; std::cout << v.empty() << std::endl;
,因为v
是一个空向量,所以会输出true
。
capacity()
方法(高级用法):返回vector
在不重新分配内存的情况下能够容纳的元素数量。这与size()
不同,size()
是当前元素的数量,而capacity()
是潜在的容量。
- 示例:
std::vector<int> v; std::cout << v.capacity() << std::endl;
,对于一个新创建的空向量,capacity
可能是 0(具体取决于实现)。当添加元素时,capacity
可能会根据一定的策略自动增长。
6 遍历向量
- 使用索引遍历:
- 可以像遍历数组一样,使用索引和
[]
运算符或者at()
方法来遍历vector
。
- 示例:
std::vector<int> v = {1, 2, 3}; for (int i = 0; i < v.size(); i++) { std::cout << v[i] << " "; }
,这里会输出1 2 3
。
- 使用迭代器遍历(推荐用于更复杂的操作):
vector
提供了迭代器来访问元素。begin()
方法返回指向第一个元素的迭代器,end()
方法返回指向最后一个元素之后位置的迭代器。
- 示例:
std::vector<int> v = {1, 2, 3}; for (std::vector<int>::iterator it = v.begin(); it!= v.end(); it++) { std::cout << *it << " "; }
,这里通过迭代器it
来访问元素,*it
表示迭代器指向的元素,输出结果也是1 2 3
。在 C++ 11 及以上版本,还可以使用更简洁的范围 - based for 循环来遍历vector
:for (int element : v) { std::cout << element << " "; }
,同样会输出1 2 3
。