C ++中的2D向量–实用教程2D向量

时间:2020-02-23 14:29:52  来源:igfitidea点击:

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 &lt;int> row(num_col,0)'-在此语句中,我们创建一个称为''row'的一维向量,其长度由''num_col'定义,默认值为''0 '`。
    它基本上形成了二维矢量的每一行。

  • 'vector &lt;vector &lt;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()'函数。