C++ vector容器的用法(附带实例)
C++ 中的 vector 是一个封装了动态数组的顺序容器(Sequence Container)。顺序容器中的元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问对应的元素,支持数组表示法和随机访问。
vector 使用一个内存分配器动态处理存储需求,在无法确定数组大小时可使用 vector。使用 vector 时需要引入头文件
注意,在中间插入元素时需要将插入位置之后的所有元素后移,时间复杂度为 O(n),效率较低。
例如:
【实例】给出一个正整数 n,对这个数字一直进行下面的操作:若这个数字是奇数,则将其乘以 3 再加 1,否则除以 2。经过若干循环后,最终都会回到 1。
这就是著名的“角谷猜想”。例如当 n=20 时,变化的过程是 20→10→5→16→8→4→2→1,如下图所示:
要求编程实现:输入一个正整数 n,从最后的 1 开始,逆序输出整个变化序列,以空格隔开。
vector 使用一个内存分配器动态处理存储需求,在无法确定数组大小时可使用 vector。使用 vector 时需要引入头文件
#include<vector>
。
vector容器的基本操作
1) 创建vector容器
向量能够存储各种类型的对象,比如 C++标准数据类型、结构体类型等。例如:vector<int> a; // 创建一个空向量 a,数据类型为 int,相当于一维数组 a[],数组大小不定 vector<int> a(100); // 创建一个向量 a,元素数量为 100,所有元素的初始值都为默认值 0 vector<int> a(10, 666); // 创建一个向量 a,元素数量为 10,所有元素的初始值都为 666 vector<int> b(a); // 向量 b 由向量 a 复制而来 vector<int> b(a.begin() + 3, a.end() - 3); // 复制 [a.begin() + 3, a.end() - 3) 区间的元素到向量 b vector<int> a[5]; // 创建一个二维数组,相当于创建了 5 个向量,每个都是一维数组
2) vector容器插入元素
向 vector 中插入元素时,既可以在尾部插入,也可以在中间插入。注意,在中间插入元素时需要将插入位置之后的所有元素后移,时间复杂度为 O(n),效率较低。
a.push_back(5); // 在向量 a 尾部插入 1 个元素 5 a.insert(a.begin() + 1, 10); // 在 a.begin() + 1 位置前插入 1 个 10 a.insert(a.begin() + 1, 5, 10); // 在 a.begin() + 1 位置前插入 5 个 10 a.insert(a.begin() + 1, b.begin(), b.begin() + 3); // 在 a.begin() + 1 位置前插入 b 向量的前 3 个元素
3) vector容器删除元素
既可以删除尾部元素及指定位置的元素、区间,也可以清空整个向量。例如:a.pop_back(); // 删除向量 a 中的最后一个元素 a.erase(a.begin() + 1); // 删除 a.begin() + 1 位置的元素 a.erase(a.begin() + 3, a.end() - 3); // 删除 [a.begin() + 3, a.end() - 3) 区间的元素 a.clear(); // 清空整个向量
4) vector容器遍历元素
既可以用数组表示法,也可以用迭代器对向量中的元素进行访问。例如:for (int i = 0; i < a.size(); i++) // 用数组表示法遍历 cout << a[i] << "\t"; for (vector<int>::iterator it = a.begin(); it != a.end(); it++) cout << *it << "\t"; // 用迭代器遍历
5) 改变vector容器的大小
函数 resize() 可以改变向量的大小,若其参数比向量大,则填充默认值 0;若其参数比向量小,则舍弃向量后面的部分。例如:
a.resize(5); // 设置向量 a 的大小为 5,若在向量 a 中有 8 个元素,则舍弃后面 3 个元素
【实例】给出一个正整数 n,对这个数字一直进行下面的操作:若这个数字是奇数,则将其乘以 3 再加 1,否则除以 2。经过若干循环后,最终都会回到 1。
这就是著名的“角谷猜想”。例如当 n=20 时,变化的过程是 20→10→5→16→8→4→2→1,如下图所示:

要求编程实现:输入一个正整数 n,从最后的 1 开始,逆序输出整个变化序列,以空格隔开。
#include <iostream> #include <vector> using namespace std; int main() { int n; vector<int> a; cin >> n; while (n != 1) { a.push_back(n); // 存入数组 if (n % 2) n = 3 * n + 1; // 奇数,乘以 3 加 1 else n /= 2; // 偶数,除以 2 } a.push_back(1); // 把最后的 1 存入数组 for (int j = a.size() - 1; j >= 0; j--) // 逆序输出 cout << a[j] << ' '; return 0; }运行结果为:
20
1 2 4 8 16 5 10 20