C++ vector 用法小结
vector简介
vector是一个能够存放任意类型的动态数组容器,能够存储任意类型的元素,并支持动态调整大小。
引用头文件
#include <vector>
常用操作
初始化
#include <iostream>
#include <vector>
vector<int> vec1; // 空 vector
vector<int> vec2(5, 10); // 包含5个值为10的元素
vector<int> vec3 = {1, 2, 3}; // 初始化列表
vector<int> vec4(vec3); // 拷贝构造
容器尾部插入元素
- push_back:该方法用于在 vector 的末尾添加一个元素。它接受一个参数,这个参数是要添加到容器末尾的元素的值。
#include <iostream>
#include <vector>
vector<string> vec;
vec.push_back("hello");
vec.push_back("world");
for (const auto& s : vec) {
// 输出: hello world
scout << s << " ";
}
- emplace_back:该方法用于在 vector 的末尾直接构造元素。它接受一个或多个参数,这些参数直接用于构造容器中新元素的构造函数。这通常比先构造一个对象然后使用 push_back 将对象添加到容器中更高效,因为它减少了不必要的拷贝或移动操作。
#include <iostream>
#include <vector>
vector<string> vec;
//直接通过构造参数添加对象, 构造包含5个'a'的string
vec.emplace_back(5, 'a');
//输出结果
for (const auto& s : vec) {
// 输出: aaaaa
cout << s << " ";
}
#include <iostream>
#include <vector>
//对于需要多个参数构造的对象更高效
struct Point {
int x, y;
Point(int a, int b) : x(a), y(b) {}
};
vector<Point> points;
//直接构造Point对象
points.emplace_back(1, 2);
points.emplace_back(3, 4);
for (const auto& s : points) {
// 输出:
//1 2
//3 4
cout << s.x << " " << s.y << " " << endl;
}
- push_back和emplace_back区别:
- push_back:需要先构造对象,再将其添加到容器中。
- emplace_back:直接在容器内存中构造对象,无需额外的拷贝或移动。
删除容器末尾元素
pop_back:
#include <iostream>
#include <vector>
vector<int> numbers = { 10, 20, 30, 40, 50 };
cout << "删除前 vector 内容: ";
for (int num : numbers) {
cout << num << " ";
}
cout << endl;
cout << "执行 pop_back() 操作..." << std::endl;
numbers.pop_back();
cout << "删除后 vector 内容: ";
for (int num : numbers) {
cout << num << " ";
}
cout << endl;

清空容器所有元素
#include <iostream>
#include <vector>
vector<int> numbers = { 10, 20, 30, 40, 50 };
cout << "清空前 vector 内容: ";
for (int num : numbers) {
cout << num << " ";
}
cout << std::endl;
numbers.clear();
cout << "清空后 vector 内容: ";
for (int num : numbers) {
cout << num << " ";
}

访问容器指定位置元素
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3,4,5,6 };
int first = vec1.front(); // 第一个元素
int last = vec1.back(); // 最后一个元素
int x = vec1.at(0); //第一个元素
int y = vec1[0]; //第一个元素
cout << x << " " << y << " " << first << " " << last << endl;

使用迭代器遍历访问容器元素
#include <iostream>
#include <vector>
vector<int> vc = { 10, 20, 30, 40, 50 };
//正向迭代
cout << "正向迭代" << endl;
for (vector<int>::iterator it = vc.begin(); it != vc.end(); it++) {
cout << *it << endl;
}
cout << "反向迭代" << endl;
for (auto it = vc.rbegin(); it != vc.rend(); ++it) {
cout << *it << endl;
}

修改元素
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3,4,5,6 };
vec1[5] = 7;
for (size_t i = 0; i < vec1.size(); i++) {
cout << vec1[i] << " ";
}

使用for循环遍历访问容器元素
#include <iostream>
#include <vector>
vector<int> vc = { 1, 2, 3, 4, 5 };
for (size_t i = 0; i < vc.size(); i++) {
cout << vc[i] << " ";
}
cout << std::endl;

判断容器是否为空
#include <iostream>
#include <vector>
vector<int> numbers1;
vector<int> numbers2 = {};
vector<int> numbers3 = {1};
bool isEmpty1 = numbers1.empty();
bool isEmpty2 = numbers2.empty();
bool isEmpty3 = numbers3.empty();
cout << "numbers1:" << (isEmpty1 ? "为空" : "非空") << endl;
cout << "numbers2:" << (isEmpty2 ? "为空" : "非空") << endl;
cout << "numbers3:" << (isEmpty3 ? "为空" : "非空") << endl;

获取当前容器元素数量
#include <iostream>
#include <vector>
vector<int> numbers1;
vector<int> numbers2 = {};
vector<int> numbers3 = {1};
int count1 = numbers1.size();
int count2 = numbers2.size();
int count3 = numbers3.size();
cout << "numbers1数量:" << count1 << endl;
cout << "numbers2数量:" << count2 << endl;
cout << "numbers3数量:" << count3 << endl;

获取当前容器分配的容量
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3 };
size_t capacity = vec1.capacity();
在指定位置插入元素
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3 };
//在开头插入0
vec1.insert(vec1.begin(), 0);
//在末尾插入多个元素
vec1.insert(vec1.end(), { 4, 5, 6 });
for (int num : vec1) {
cout << num << " ";
}

删除指定位置元素
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3,4,5,6 };
// 删除第一个元素
vec1.erase(vec1.begin());
// 注意,若要删除容器最后元素应该写成end()-1或者使用pop_back(),且确保容器元素非空
vec1.erase(vec1.end()-1);
// 删除前两个元素
vec1.erase(vec1.begin(), vec1.begin() + 2);
交换vector
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3};
vector<int> vec2 = { 4,5,6 };
cout << "交换前" << endl;
for (int num : vec1) {
cout << num << " ";
}
cout << endl;
for (int num : vec2) {
cout << num <<" ";
}
cout << endl;
vec1.swap(vec2);
cout << "交换后" << endl;
for (int num : vec1) {
cout << num << " ";
}
cout << endl;
for (int num : vec2) {
cout << num << " ";
}
cout << endl;

查找元素的位置
#include <iostream>
#include <vector>
vector<int> vec1 = { 1,2,3,4,5,6 };
auto it = find(vec1.begin(), vec1.end(),3);
if (it != vec1.end()) {
cout << "元素3的下标为" << it - vec1.begin() << endl;
}

升序排序
#include <iostream>
#include <vector>
#include <algorithm>
vector<int> vec1 = { 16,3,8,10,52,9,4,21,57 };
cout << "排序前" << endl;
for (int num : vec1) {
cout << num << " ";
}
cout << endl;
sort(vec1.begin(), vec1.end());
cout << "升序排序后" << endl;
for (int num : vec1) {
cout << num << " ";
}
cout << endl;

降序排序
#include <iostream>
#include <vector>
#include <algorithm>
vector<int> vec1 = { 16,3,8,10,52,9,4,21,57 };
cout << "排序前" << endl;
for (int num : vec1) {
cout << num << " ";
}
cout << endl;
sort(vec1.begin(), vec1.end(), greater<int>());
cout << "降序后" << endl;
for (int num : vec1) {
cout << num << " ";
}
cout << endl;

实战编程
遍历嵌套向量(二维向量)
- 打印二维字符串向量
#include <iostream>
#include <vector>
vector<vector<string>> all_outputs =
{
{"Hello", "World"},
{"C++", "Programming"},
{"is", "awesome"}
};
//逐行输出二维向量里的每个字符串
for (const auto& outputs : all_outputs) {
for (const string& line : outputs) {
cout << line << endl;
}
}
//逐行输出内部向量的所有字符串,并以空格分隔
for (const auto& outputs : all_outputs) {
for (size_t i = 0; i < outputs.size(); i++) {
cout << outputs[i];
//最后一个元素不需要空格
if (i != outputs.size() - 1) {
cout << " ";
}
}
cout << endl;
}
逐行输出二维向量里的每个字符串的结果:

逐行输出内部向量的所有字符串,并以空格分隔的结果:

- 多维数组动态输入与输出
#include <iostream>
#include <vector>
int n;
//定义每个数组大小
cout << "请输入数组大小: ";
cin >> n;
//定义二维向量存储所有输入
vector<std::vector<int>> all_inputs;
//定义需要输入几组数据
int num_datasets;
cout << "请输入数据组数: ";
cin >> num_datasets;
// 循环读取多组数据
for (int i = 0; i < num_datasets; ++i) {
//创建大小为n的一维向量
vector<int> arr(n);
cout << "请输入第 " << i + 1 << " 组的 " << n << " 个整数: ";
//遍历添加数据元素
for (int j = 0; j < n; ++j) {
cin >> arr[j];
}
//将当前数组添加到二维向量中
all_inputs.push_back(arr);
}
//输出所有输入的数据
cout << "\n您输入的所有数据如下:\n";
for (size_t i = 0; i < all_inputs.size(); ++i) {
cout << "第 " << i + 1 << " 组: ";
for (size_t j = 0; j < all_inputs[i].size(); ++j) {
cout << all_inputs[i][j] << " ";
}
cout << "\n";
}

人生如逆旅
我亦是行人

浙公网安备 33010602011771号