C++二维向量完全指南:从入门到精通的实用教程
也被称为向量的向量,C++中的二维向量构成了创建矩阵、表格或任何其他结构的基础,具有动态性。在涉及C++中的二维向量之前,建议先学习使用单维向量的教程。
包含向量头文件
如果不是在程序开始时包含头文件,我们在C++中使用向量将是不可能的。为了使用2D向量,我们需要包含:
#include<vector>
不用一个一个地包含众多种类的标准模板库(STL),我们可以通过以下方式一次性包含所有它们:
#include<bits/stdc++.h>
在C++中初始化2D向量
首先,我们将学习一些初始化二维向量的方法。下面的代码片段解释了当所有元素已知时如何初始化二维向量。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<vector<int>> v {{1, 0, 1}, {0, 1}, {1, 0, 1}};
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
在运行以上代码之后,我们得到了以下的输出结果。
1 0 1
0 1
1 0 1
使用 ‘vector<vector<>>’ 的符号表示我们正在处理一个向量的向量。第一组花括号内的每个值,如 ‘{1, 0, 1}’ 和 ‘{0, 1}’,都是独立的向量。
注意:要在 C++ 中创建不同数据类型的 2D 向量,我们可以像
vector<vector<float>>
这样在最内部的尖括号中放置数据类型。
由于我们正在处理一个二维数据结构,为了高效遍历整个数据结构,我们需要两个循环。外层循环沿着行移动,而内层循环遍历列。
注意:’size()’函数提供的是二维向量中向量的数量,而不是每个单独向量中元素的总数量。
指定2D向量初始化的大小
C++中的二维向量-实用指南(第2部分,共6部分)
二维向量的大小可以很大。我们不能指望程序员手动输入每个值。因此,我们可以根据行数和列数来初始化一个二维向量。
#include<iostream>
#include<vector>
using namespace std;
int main(){
//列数
int num_col = 3;
// 行数
int num_row = 4;
// 初始化单行向量
vector<int> row(num_col, 0);
// 初始化二维向量
vector<vector<int>> v(num_row, row) ;
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
输出将是:
0 0 0
0 0 0
0 0 0
0 0 0
根据向量的标准初始化 vector v(10, 0)
,第一个参数表示向量的大小,而第二个参数表示每个单元格所持有的默认值。
在上述代码片段中,我们遵循两个标准初始化的步骤:
vector row(num_col, 0)
– 在这个语句中,我们创建了一个名为’row’的一维向量,其长度由’num_col’定义,默认值为’0’。它基本上构成了我们二维向量的每一行。vector<vector> v(num_row, row)
– 在这个语句中,我们通过将二维向量的每个值定义为上一语句中创建的’row’,从而创建了完整的二维向量。
在理解了上述过程之后,我们可以通过以下方式来改进我们在C++中对二维向量的初始化方法:
#include<iostream>
#include<vector>
using namespace std;
int main(){
//列数
int num_col = 3;
// 行数
int num_row = 4;
// 初始化二维向量
vector<vector<int>> v(num_row, vector<int> (num_col, 0)) ;
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
由于我们在代码中进行了完全相同的操作,只是用一行代码实现,所以以上代码将产生与之前类似的输出结果。
如果我们还记得的话,标准的初始化看起来有点像上面的那个。创建一个二维向量需要我们将每个元素的默认值设置为一个一维向量。
最后一种方法是在不知道行或列的情况下创建一个二维向量。这个方法是通过以下步骤完成的:
vector<vector<int>> v;
上述声明创建了一个空容器,该容器能够以向量形式存储元素。
二维向量的迭代器
这是文章《C++中的二维向量-实用指南》的第3部分(共6部分)。
除了使用索引遍历二维向量外,C++还为每个特定的STL数据结构提供了迭代器的选项。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<vector<int>> v {{1, 0, 1}, {0, 1}, {1, 0, 1}};
// Iterator for the 2-D vector
vector<vector<int>>::iterator it1;
// Iterator for each vector inside the 2-D vector
vector<int>::iterator it2;
// Traversing a 2-D vector using iterators
for(it1 = v.begin();it1 != v.end();it1++){
for(it2 = it1->begin();it2 != it1->end();it2++)
cout<<*it2<<" ";
cout<<endl;
}
}
输出:
1 0 1
0 1
1 0 1
当我们执行某些需要定位参数的操作时,迭代器非常方便。返回迭代器值最常用的两个函数是:
- ‘v.begin()’ – 返回指向二维向量中第一个向量的迭代器。
- ‘v.end()’ – 返回指向二维向量末尾的迭代器。
让我们来看一些可以在二维向量上进行的操作。
将元素添加到一个二维向量中
这是文章《C++中的二维向量-实用指南》的第4部分(共6部分)。
在二维向量的末尾添加元素时,我们使用’push_back()’函数。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// 初始化二维向量
vector<vector<int>> v;
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
输出:
1 0 1
0 1
1 0 1
由于我们的容器是一个向量的向量,因此只有将完整的向量推入其中才有意义。因此,在’push_back()’函数中传递的参数必须是一个向量。
注意:’v[i]’代表一个一维向量。因此,如果程序员需要在二维向量内的某个向量中添加元素,他可以使用’v[i].push_back(value)’。
为了在特定位置添加完整的向量,我们使用”insert()”函数。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// 初始化二维向量
vector<vector<int>> v;
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
// 二维向量的迭代器
vector<vector<int>>::iterator it = v.begin();
// 在第二个位置插入向量 = {1, 2, 3}
v.insert(it + 1, {1, 2, 3});
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
输出:
1 0 1
1 2 3
0 1
1 0 1
‘insert()’函数需要一个迭代器作为位置参数,而不是一个整数索引。紧接着是要在指定位置插入的向量。
从C++的二维向量中删除元素
与’push_back()’相反,C++提供了’pop_back()’函数,其职责是从给定向量中删除最后一个元素。
在本文的背景下,’pop_back()’函数将负责从二维向量中删除最后一个向量。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// 初始化二维向量
vector<vector<int>> v ;
// 向空的二维向量添加向量
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
// 从二维向量中删除最后一个向量
v.pop_back();
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
输出结果:
1 0 1
0 1
除了’pop_back()’函数之外,C++还提供了’erase()’函数,可以按照指定的索引删除元素。
#include<iostream>
#include<vector>
using namespace std;
int main(){
// 初始化二维向量
vector<vector<int>> v ;
// 向空的二维向量中推入向量
v.push_back({1, 0, 1});
v.push_back({0, 1});
v.push_back({1, 0, 1});
// 二维向量的迭代器
vector<vector<int>>::iterator it = v.begin();
// 从二维向量中删除第二个向量
v.erase(it + 1);
for(int i=0;i<v.size();i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
输出结果:
1 0 1
1 0 1
与’insert()’函数类似,’erase()’函数需要一个可迭代的位置参数。要从二维向量中删除所有向量,可以使用’clear()’函数。
在使用C++中的二维向量时,以上功能足以满足基本操作需求。
结论
对于熟悉相关语法的程序员来说,C++中的二维向量使用起来非常简单。在处理矩阵运算、图形处理以及其他二维数据结构相关问题时,二维向量是一种极为实用的工具。
通过本教程的学习,希望读者能够掌握C++二维向量的使用方法,并在实际编程中灵活应用。如果您对二维向量有任何疑问或建议,欢迎在下方评论区留言交流,我们将及时为您解答。