vector 是 C++ 标准模板库(STL)中的一个容器类,表示一个动态数组。与普通的 C++ 数组相比,vector 的大小是可动态调整的,且提供了许多有用的功能和方法。
基本用法
- 声明和初始化:
vector<int> v; // 声明一个空的整数向量
vector<int> v(5); // 声明一个有5个元素的整数向量,初始值为0
vector<int> v(5, 10); // 声明一个有5个元素的整数向量,初始值为10
vector<int> v = {1, 2, 3, 4, 5}; // 用初始化列表初始化向量
- 访问元素:
v[0] = 10; // 通过下标访问元素,向量的第一个元素被赋值为10
int x = v[1]; // 获取向量的第二个元素
int y = v.at(2); // 通过at()方法获取第三个元素,带边界检查
- 向量大小:
int size = v.size(); // 获取向量的大小(元素个数)
- 添加和删除元素:
v.push_back(20); // 在向量末尾添加一个元素
v.pop_back(); // 删除向量末尾的元素
- 遍历向量:
for(int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
// 使用范围for循环
for(int x : v) {
cout << x << " ";
}
- 插入和删除特定位置的元素:
v.insert(v.begin() + 1, 15); // 在第二个位置插入15
v.erase(v.begin() + 2); // 删除第三个位置的元素
- 清空向量:
v.clear(); // 清空所有元素
示例代码
下面是一个完整的示例,展示了如何使用 vector 来解决两数之和问题,并使用它来操作一个整数向量:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {}; // 返回空向量,表示没有找到结果
}
};
int main() {
// 定义一个向量并初始化
vector<int> nums = {2, 7, 11, 15};
int target = 9;
// 创建 Solution 对象并调用 twoSum 方法
Solution sol;
vector<int> result = sol.twoSum(nums, target);
// 输出结果
if (!result.empty()) {
cout << "Indices: " << result[0] << ", " << result[1] << endl;
} else {
cout << "No solution found." << endl;
}
return 0;
}
代码解释
vector<int> nums = {2, 7, 11, 15};:定义了一个整数向量nums,并用{2, 7, 11, 15}初始化它。Solution sol;:创建一个Solution类的实例sol。vector<int> result = sol.twoSum(nums, target);:调用twoSum方法,将nums和target传入,并返回一个结果向量result。if (!result.empty()):检查返回的向量是否为空。如果非空,则输出结果索引;否则输出没有找到解决方案。
使用 vector 能使你在C++中方便地操作动态数组,支持各种常用的操作,并且是标准模板库中非常常用的容器之一。
vector 是 C++ 标准模板库(STL)中最常用的容器之一。它是一个动态数组,可以根据需要调整大小,并提供了一系列强大的方法来操作数据。以下是一些 vector 的高级用法和知识,以及一些示例代码:
1. 向量的创建和初始化
#include <vector>
using namespace std;
vector<int> vec1; // 创建一个空向量
vector<int> vec2(5); // 创建一个包含5个元素的向量,所有元素初始化为0
vector<int> vec3(5, 10); // 创建一个包含5个元素的向量,所有元素初始化为10
vector<int> vec4 = {1, 2, 3, 4, 5}; // 使用初始化列表初始化向量
vector<int> vec5(vec4); // 拷贝构造函数
2. 访问和修改元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 访问元素
cout << "First element: " << vec[0] << endl;
cout << "Second element: " << vec.at(1) << endl; // 使用at()方法,带边界检查
// 修改元素
vec[0] = 10;
vec.at(1) = 20;
// 输出修改后的向量
for (int i : vec) {
cout << i << " ";
}
cout << endl;
return 0;
}
3. 动态调整大小
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3};
vec.push_back(4); // 在向量末尾添加元素
vec.push_back(5);
vec.pop_back(); // 删除向量末尾的元素
cout << "Size: " << vec.size() << endl; // 获取向量大小
vec.resize(10); // 将向量大小调整为10
cout << "New size: " << vec.size() << endl;
vec.clear(); // 清空向量
cout << "Size after clear: " << vec.size() << endl;
return 0;
}
4. 插入和删除元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 插入元素
vec.insert(vec.begin() + 2, 10); // 在第三个位置插入10
// 删除元素
vec.erase(vec.begin() + 3); // 删除第四个位置的元素
// 输出修改后的向量
for (int i : vec) {
cout << i << " ";
}
cout << endl;
return 0;
}
5. 遍历向量
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 使用索引遍历
for (size_t i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
// 使用范围for循环遍历
for (int i : vec) {
cout << i << " ";
}
cout << endl;
// 使用迭代器遍历
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
6. 其他有用的方法
capacity(): 返回向量在不重新分配内存的情况下可以包含的元素个数。empty(): 如果向量为空,返回true。reserve(size_type n): 预留存储空间至少可以包含n个元素,而不改变向量的大小。shrink_to_fit(): 减少向量的容量以适应其大小。assign(): 用新内容替换向量中的内容。
示例
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec;
vec.reserve(10); // 预留空间,防止多次重新分配内存
vec.assign(5, 100); // 用5个100替换向量中的内容
cout << "Size: " << vec.size() << endl;
cout << "Capacity: " << vec.capacity() << endl;
vec.shrink_to_fit(); // 调整容量以适应实际大小
cout << "New capacity: " << vec.capacity() << endl;
// 输出向量内容
for (int i : vec) {
cout << i << " ";
}
cout << endl;
return 0;
}
这些示例展示了 vector 的常用功能和高级用法。vector 是一个非常灵活和强大的容器,能够满足大多数动态数组的需求。在使用 vector 时,理解其容量和大小管理机制,以及各种成员函数的用法,可以使你的程序更高效、更易维护。
using namespace std; 是 C++ 语言中的一条指令,它的作用是让程序在使用 std(标准命名空间)中的对象或函数时,不需要显式地加上 std:: 前缀。例如,cout 可以直接写成 cout 而不是 std::cout。
下面我们详细解释每一句代码:
完整代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 创建一个 3x4 的二维 vector,初始值为 0
vector<vector<int>> matrix(3, vector<int>(4, 0));
// 赋值
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
matrix[i][j] = i * 10 + j;
}
}
// 输出
for (const auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
return 0;
}
逐行解释
1. 头文件引入
#include <iostream>
#include <vector>
#include <iostream>:引入 C++ 的标准输入输出流库,用于cout、cin等操作。#include <vector>:引入vector头文件,提供动态数组(向量)功能。
2. 命名空间
using namespace std;
- 让
std::vector、std::cout等标准库组件可以直接使用,无需加std::前缀。 - 如果不使用这句代码,那么
cout需要写成std::cout,vector需要写成std::vector。
3. main 函数
int main() {
main()是 C++ 程序的入口,程序执行从这里开始。
4. 创建一个二维 vector
vector<vector<int>> matrix(3, vector<int>(4, 0));
vector<vector<int>> matrix:定义一个二维vector,可以看作是一个动态的二维数组。matrix(3, vector<int>(4, 0)):
- 创建 3 行,每行是一个
vector<int>,大小为 4,初始值为 0。 - 相当于
int matrix[3][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}};,但vector可以动态扩展。
5. 赋值(填充矩阵)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
matrix[i][j] = i * 10 + j;
}
}
- 通过两层
for循环遍历matrix,并对每个元素赋值。 - 赋值规则:
matrix[i][j] = i * 10 + j; - 例如:
matrix[0][0] = 0 * 10 + 0 = 0matrix[1][2] = 1 * 10 + 2 = 12matrix[2][3] = 2 * 10 + 3 = 23- 结果是:
0 1 2 3
10 11 12 13
20 21 22 23
6. 遍历并输出二维数组
for (const auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
外层 for 循环
for (const auto& row : matrix)
auto& row:使用auto让编译器推导row的类型,&表示引用,避免拷贝,提高效率。row代表matrix中的一行,即vector<int>类型。
内层 for 循环
for (int val : row)
val遍历row中的每个元素,并输出。
cout << val << " ";
- 输出当前元素,后面加一个空格,使其格式化输出。
cout << endl;
- 每打印完一行后换行。
7. 结束 main 函数
return 0;
return 0;表示程序成功结束。
最终输出
0 1 2 3
10 11 12 13
20 21 22 23
- 3 行 4 列的矩阵被正确输出。
总结
vector<vector<int>> matrix(3, vector<int>(4, 0));
- 创建 3×4 的二维
vector,初始值为0。
- 双重
for循环填充数据。 - 使用范围
for遍历输出矩阵。 using namespace std;让代码更简洁,但在大型项目中建议使用std::以避免命名冲突。
当然!下面是几个使用 vector 存储二维数组的不同示例,包括不同的初始化方式、动态调整大小等。
示例 1:创建一个 m × n 的二维 vector 并手动输入数据
#include <iostream>
#include <vector>
using namespace std;
int main() {
int m, n;
cout << "请输入矩阵的行数和列数:";
cin >> m >> n;
// 创建 m x n 的二维 vector
vector<vector<int>> matrix(m, vector<int>(n));
// 读取用户输入
cout << "请输入矩阵的元素:" << endl;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> matrix[i][j];
}
}
// 输出矩阵
cout << "输入的矩阵是:" << endl;
for (const auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
return 0;
}
说明:
- 用户可以输入
m和n,然后输入m × n个元素,存入vector并打印。 - 适用于动态创建矩阵的情况。
示例 2:不同大小的行(非规则矩阵)
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> matrix;
// 第一行有 3 个元素
matrix.push_back({1, 2, 3});
// 第二行有 5 个元素
matrix.push_back({4, 5, 6, 7, 8});
// 第三行有 2 个元素
matrix.push_back({9, 10});
// 输出不规则矩阵
cout << "非规则矩阵:" << endl;
for (const auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
return 0;
}
输出
非规则矩阵:
1 2 3
4 5 6 7 8
9 10
说明
- 这里的
vector并非严格的m × n形状,而是变长的每一行。 push_back({})直接向vector添加一整行。
示例 3:动态调整矩阵大小
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> matrix(2, vector<int>(2, 1)); // 2x2 矩阵,初始值为 1
// 输出原始矩阵
cout << "原始矩阵:" << endl;
for (const auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
// 添加新的一行
matrix.push_back({3, 3, 3});
// 在第一行增加一个元素
matrix[0].push_back(2);
// 输出调整后的矩阵
cout << "调整后的矩阵:" << endl;
for (const auto& row : matrix) {
for (int val : row) {
cout << val << " ";
}
cout << endl;
}
return 0;
}
输出
原始矩阵:
1 1
1 1
调整后的矩阵:
1 1 2
1 1
3 3 3
说明
matrix.push_back({3, 3, 3})在最后增加了一行。matrix[0].push_back(2)在第一行末尾添加2。
示例 4:使用指针访问 vector 存储的二维数组
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 使用指针遍历
for (const auto& row : matrix) {
for (const int* ptr = &row[0]; ptr < &row[0] + row.size(); ++ptr) {
cout << *ptr << " ";
}
cout << endl;
}
return 0;
}
输出
1 2 3
4 5 6
7 8 9
说明
&row[0]获取当前行的首地址,ptr++访问该行的元素,类似 C 风格数组。
示例 5:转换 vector<vector<int>> 为 vector<int>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
vector<int> flatMatrix;
// 展平 2D 矩阵到 1D 数组
for (const auto& row : matrix) {
flatMatrix.insert(flatMatrix.end(), row.begin(), row.end());
}
// 输出展平后的矩阵
cout << "展平后的矩阵:" << endl;
for (int val : flatMatrix) {
cout << val << " ";
}
return 0;
}
输出
展平后的矩阵:
1 2 3 4 5 6 7 8 9
说明
insert(flatMatrix.end(), row.begin(), row.end())把row添加到flatMatrix末尾。- 适用于某些算法需要
1D数组时的情况。
总结
| 示例 | 说明 |
| 示例 1 | 用户输入 m × n 的二维 vector |
| 示例 2 | 不规则矩阵,每行大小不同 |
| 示例 3 | 动态调整矩阵大小 |
| 示例 4 | 用指针遍历 vector |
| 示例 5 | 将二维 vector 展平为一维 vector |
好