本文最后更新于 34 天前,其中的信息可能已经有所发展或是发生改变。
一、初始化时赋值(创建时就给值)
1. 直接初始化(最常用)
vector<int> v1 = {1, 2, 3, 4, 5}; // C++11开始支持
vector<int> v2{6, 7, 8, 9, 10}; // 直接列表初始化
vector<int> v3({1, 2, 3, 4, 5}); // 用圆括号
2. 指定大小和初始值
vector<int> v4(5, 100); // 创建5个元素,每个都是100
// 结果:{100, 100, 100, 100, 100}
vector<int> v5(3); // 创建3个元素,默认值为0
// 结果:{0, 0, 0}
二、创建后赋值
3. 逐个添加(push_back)
vector<int> v;
v.push_back(10); // 添加10
v.push_back(20); // 添加20
v.push_back(30); // 添加30
// 结果:{10, 20, 30}
4. 列表赋值
vector<int> v;
v = {1, 2, 3, 4, 5}; // 直接赋值为新列表
// 结果:{1, 2, 3, 4, 5}
5. 清空后重新赋值
vector<int> v = {1, 2, 3};
v.clear(); // 清空所有元素
v = {4, 5, 6, 7}; // 重新赋值
// 结果:{4, 5, 6, 7}
三、从其他vector赋值
6. 拷贝赋值
vector<int> v1 = {1, 2, 3, 4, 5};
vector<int> v2 = v1; // 完全拷贝
vector<int> v3(v1); // 用构造函数拷贝
// v2和v3都是{1, 2, 3, 4, 5},但与v1独立
7. assign方法赋值
vector<int> v = {1, 2, 3};
v.assign({4, 5, 6, 7}); // 替换为{4, 5, 6, 7}
// 结果:{4, 5, 6, 7}
四、从数组赋值
8. 从C风格数组赋值
int arr[] = {1, 2, 3, 4, 5};
vector<int> v(arr, arr + 5); // 用指针范围初始化
// 结果:{1, 2, 3, 4, 5}
9. 从数组片段赋值
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
vector<int> v(arr + 2, arr + 6); // 取arr[2]到arr[5]
// 结果:{3, 4, 5, 6}
五、从其他容器赋值
10. 从另一个vector赋值
vector<int> v1 = {1, 2, 3, 4, 5};
vector<int> v2;
v2.assign(v1.begin(), v1.end()); // 完全赋值
// 结果:{1, 2, 3, 4, 5}
vector<int> v3;
v3.assign(v1.begin() + 1, v1.begin() + 4); // 部分赋值
// 结果:{2, 3, 4}
六、特殊赋值方法
11. 插入赋值
vector<int> v = {1, 4, 5};
v.insert(v.begin() + 1, 2); // 在位置1插入2
v.insert(v.begin() + 2, 3); // 在位置2插入3
// 结果:{1, 2, 3, 4, 5}
12. 插入多个相同值
vector<int> v = {1, 5};
v.insert(v.begin() + 1, 3, 0); // 插入3个0
// 结果:{1, 0, 0, 0, 5}
13. 插入一个列表
vector<int> v = {1, 6};
v.insert(v.begin() + 1, {2, 3, 4, 5}); // 插入列表
// 结果:{1, 2, 3, 4, 5, 6}
七、emplace_back(高效添加)
14. 使用emplace_back
vector<int> v;
v.emplace_back(10); // 在末尾直接构造,比push_back高效
v.emplace_back(20);
v.emplace_back(30);
// 结果:{10, 20, 30}
八、交换赋值
15. 用swap交换
vector<int> v1 = {1, 2, 3};
vector<int> v2 = {4, 5, 6, 7};
v1.swap(v2); // 交换两个vector的内容
// v1变成{4, 5, 6, 7}
// v2变成{1, 2, 3}
九、完整示例代码
#include <iostream>
#include <vector>
#include <algorithm> // 用于generate
using namespace std;
int main() {
cout << "=== vector赋值方法大全 ===" << endl;
// 1. 直接初始化
cout << "1. 直接初始化: ";
vector<int> v1 = {1, 2, 3, 4, 5};
for (int num : v1) cout << num << " ";
cout << endl;
// 2. 指定大小和初始值
cout << "2. 指定大小: ";
vector<int> v2(3, 100); // 3个100
for (int num : v2) cout << num << " ";
cout << endl;
// 3. 逐个添加
cout << "3. push_back: ";
vector<int> v3;
v3.push_back(10);
v3.push_back(20);
v3.push_back(30);
for (int num : v3) cout << num << " ";
cout << endl;
// 4. 列表赋值
cout << "4. 列表赋值: ";
vector<int> v4 = {5, 6, 7};
v4 = {8, 9, 10, 11}; // 重新赋值
for (int num : v4) cout << num << " ";
cout << endl;
// 5. assign方法
cout << "5. assign: ";
vector<int> v5 = {1, 2, 3};
v5.assign({4, 5, 6, 7});
for (int num : v5) cout << num << " ";
cout << endl;
// 6. 从数组赋值
cout << "6. 从数组赋值: ";
int arr[] = {1, 3, 5, 7, 9};
vector<int> v6(arr, arr + 5);
for (int num : v6) cout << num << " ";
cout << endl;
// 7. 拷贝赋值
cout << "7. 拷贝赋值: ";
vector<int> v7 = {1, 2, 3};
vector<int> v8 = v7; // 完全拷贝
for (int num : v8) cout << num << " ";
cout << endl;
// 8. 插入赋值
cout << "8. 插入赋值: ";
vector<int> v9 = {1, 5};
v9.insert(v9.begin() + 1, 2);
v9.insert(v9.begin() + 2, 3);
v9.insert(v9.begin() + 3, 4);
for (int num : v9) cout << num << " ";
cout << endl;
// 9. emplace_back
cout << "9. emplace_back: ";
vector<int> v10;
v10.emplace_back(100);
v10.emplace_back(200);
v10.emplace_back(300);
for (int num : v10) cout << num << " ";
cout << endl;
// 10. swap交换
cout << "10. swap交换:\n";
vector<int> v11 = {1, 2, 3};
vector<int> v12 = {4, 5, 6, 7};
cout << "交换前: ";
cout << "v11: "; for (int n : v11) cout << n << " ";
cout << "v12: "; for (int n : v12) cout << n << " ";
cout << endl;
v11.swap(v12);
cout << "交换后: ";
cout << "v11: "; for (int n : v11) cout << n << " ";
cout << "v12: "; for (int n : v12) cout << n << " ";
cout << endl;
return 0;
}
十、各种方法对比和使用建议
| 方法 | 适用场景 | 特点 |
|---|---|---|
={...} | 初始化时赋值 | 最简洁,推荐 |
push_back() | 逐个添加元素 | 动态添加,常用 |
assign() | 完全替换内容 | 可以来自数组或其他容器 |
insert() | 在指定位置插入 | 灵活,可插单个或多个 |
emplace_back() | 在末尾添加 | 比push_back更高效 |
swap() | 交换两个vector | 快速交换,不复制元素 |
十一、小练习
- 创建一个vector,用3种不同的方法都赋值为{2, 4, 6, 8, 10}
- 创建一个包含10个元素的vector,所有元素都是5
- 把一个vector的前半部分赋给另一个vector
- 实现vector的反转赋值(把{1,2,3,4,5}变成{5,4,3,2,1})
十二、常见错误
// 错误1:越界访问
vector<int> v = {1, 2, 3};
v[5] = 6; // 错误!vector只有3个元素
// 错误2:访问空vector
vector<int> v2;
int x = v2[0]; // 错误!vector为空
// 正确做法:先判断再访问
if (!v2.empty()) {
int x = v2[0];
}
// 错误3:不正确的初始化
vector<int> v3(); // 这是函数声明,不是创建vector!
vector<int> v4{}; // 正确的空vector
记住:先创建,再操作,注意vector的大小和容量区别,常用方法多练习几次就熟悉了!