C ++中的2D向量–实用教程2D向量
C ++中的2D向量也称为向量向量,它构成动态创建矩阵,表或者任何其他结构的基础。
在讨论C ++中的2D矢量主题之前,建议先阅读在C ++中使用一维矢量的教程。
包括Vector头文件
如果没有C ++中的头文件,对于我们来说就不可能使用C ++中的向量。
为了利用2D向量,我们包括:
#include<vector> </code>
与其一一包含许多标准模板库(STL),我们不如将它们全部包含在内:
#include<bits/stdc++.h> </code>
在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; } } </code>
运行上面的代码后,我们得到以下输出:
1 0 1 0 1 1 0 1 </code>
"'vector <vector <>>''的使用表示我们正在研究矢量的向量。
第一组花括号内的每个值(例如''{1,0,1}'和''{0,1}'
)都是独立的向量。
<p><span style="color:#748b94" class="has-inline-color">Note: To create 2D vectors in C++ of different data-type, we can place the data-type inside the innermost angle brackets like <code><char></code>.</p>
由于我们正在研究二维数据结构,因此需要两个循环才能有效遍历完整的数据结构。
外循环沿行移动,而内循环横穿列。
<p><span style="color:#748b94" class="has-inline-color">Note: The <code>'size()'</code> function provides the number of vectors inside the 2D vector, not the total number of elements inside each individual vectors.</p>
指定2D向量初始化的大小
2D向量的大小可能很大。
我们不能期望程序员输入每个值。
因此,我们可以基于行数和列数来初始化二维矢量。
#include<iostream> #include<vector> using namespace std; int main(){ //Number of columns int num_col = 3; //Number of rows int num_row = 4; //Initializing a single row vector<int> row(num_col, 0); //Initializing the 2-D vector 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; } } </code>
输出为:
0 0 0 0 0 0 0 0 0 0 0 0 </code>
根据向量的标准初始化'vector <int> v(10,0)'`,第一个参数表示向量的大小,而第二个参数表示每个单元格所保存的默认值。
在上面的代码片段中,我们遵循标准初始化的两个步骤:
'vector <int> row(num_col,0)'
-在此语句中,我们创建一个称为''row'的一维向量,其长度由''num_col'
定义,默认值为''0 '`。
它基本上形成了二维矢量的每一行。'vector <vector <int >> v(num_row,row)
–在此语句中,我们将二维矢量的每个值定义为在最后的语句。
了解了上述过程之后,我们可以通过以下方法改进C ++中2D向量的初始化:
#include<iostream> #include<vector> using namespace std; int main(){ //Number of columns int num_col = 3; //Number of rows int num_row = 4; //Initializing the 2-D vector 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; } } </code>
上面的代码将提供与以前类似的输出,因为我们正在做完全相同的事情,但是只用一行代码。
如果我们没记错的话,标准初始化看起来与上面的类似。
创建二维向量需要我们将每个元素的默认值设置为一维向量。
最后一种方法涉及在不知道行或者列的情况下创建二维矢量。
通过以下方式完成:
vector<vector<int>> v; </code>
上面的声明创建了一个空容器,该容器能够存储矢量形式的元素。
2D向量的迭代器
C ++无需为使用索引遍历2D向量,而是为每个特定的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; } } </code>
输出:
1 0 1 0 1 1 0 1 </code>
当我们使用某些需要参数进行定位的操作时,迭代器会派上用场。
返回迭代器值的两个最常用的函数是:
''v.begin()'`–它将迭代器返回到二维向量中的第一个向量。
''v.end()'`–将迭代器返回到二维向量的末尾。
让我们看看在二维矢量上可能进行的一些操作。
将元素添加到二维向量
为了在二维向量的末尾添加元素,我们使用了'push_back()'函数。
#include<iostream> #include<vector> using namespace std; int main(){ //Initializing the 2-D vector 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; } } </code>
输出:
1 0 1 0 1 1 0 1 </code>
由于我们的容器是向量的向量,因此将完整的向量推入容器是有意义的。
因此,在'push_back()'函数内部传递的参数必须是向量。
<p><span style="color:#748b94" class="has-inline-color">Note: <code>'v[i]'</code> represents a single-dimensional vector. Therefore, if the programmer needs to add elements in a certain vector inside the 2-D vector, he Jan use <code>'v[i].push_back(value)'</code>.</p>
为了在特定位置添加完整的向量,我们使用了'insert()'函数。
#include<iostream> #include<vector> using namespace std; int main(){ //Initializing the 2-D vector vector<vector<int>> v; v.push_back({1, 0, 1}); v.push_back({0, 1}); v.push_back({1, 0, 1}); //Iterator for the 2-D vector vector<vector<int>>::iterator it = v.begin(); //Inserting the vector = {1, 2, 3} as the second vector 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; } } </code>
输出:
1 0 1 1 2 3 0 1 1 0 1 </code>
'insert()'函数需要一个位置参数作为迭代器,而不是整数索引。
它后面是一个应该在指定位置插入的向量。
在C ++中从2D向量中删除元素
与'push_back()'相反,C ++提供了'pop_back()'函数,其职责是从给定的向量中删除最后一个元素。
在本文的上下文中," pop_back()"函数将负责从二维矢量中删除最后一个矢量。
#include<iostream> #include<vector> using namespace std; int main(){ //Initializing the 2-D vector vector<vector<int>> v ; //Adding vectors to the empty 2-D vector v.push_back({1, 0, 1}); v.push_back({0, 1}); v.push_back({1, 0, 1}); //Remove the last vector from a 2-D vector 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; } } </code>
输出:
1 0 1 0 1 </code>
除了" pop_back()"函数外,我们还有一个" erase()"函数,使用该函数可以从指定的索引中删除元素。
#include<iostream> #include<vector> using namespace std; int main(){ //Initializing the 2-D vector vector<vector<int>> v ; //Pushing vector inside the empty 2-D vector v.push_back({1, 0, 1}); v.push_back({0, 1}); v.push_back({1, 0, 1}); //Iterator for the 2-D vector vector<vector<int>>::iterator it = v.begin(); //Remove the second vector from a 2-D vector 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; } } </code>
输出:
1 0 1 1 0 1 </code>
与'insert()'函数类似,它需要一个位置参数作为迭代器。
要从二维矢量中删除所有矢量,可以使用'clear()'函数。