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);         // 拷贝构造
容器尾部插入元素
  1. 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 << " ";
}
  1. 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;
}
  1. 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;

实战编程

遍历嵌套向量(二维向量)
  1. 打印二维字符串向量
#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;
}

逐行输出二维向量里的每个字符串的结果:

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

  1. 多维数组动态输入与输出
#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";
 }

posted @ 2025-06-02 22:17  相遇就是有缘  阅读(31)  评论(0)    收藏  举报