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 向量,我们可以像 这样在最内部的尖括号中放置数据类型。

由于我们正在处理一个二维数据结构,为了高效遍历整个数据结构,我们需要两个循环。外层循环沿着行移动,而内层循环遍历列。

注意:’size()’函数提供的是二维向量中向量的数量,而不是每个单独向量中元素的总数量。

指定2D向量初始化的大小

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;
	}					   
}

输出将是:

0 0 0 
0 0 0 
0 0 0 
0 0 0 

根据向量的标准初始化 ‘vector v(10, 0)’,第一个参数表示向量的大小,而第二个参数表示每个单元格所持有的默认值。

在上述代码片段中,我们遵循两个标准初始化的步骤。

  • ‘vector row(num_col, 0)’ – In this statement, we create a single-dimensional vector called ‘row’, which has length defined by ‘num_col’ and default values as ‘0’. It basically forms each row of our two-dimensional vector.
  • ‘vector<vector> v(num_row, row) – In this statement, we create our complete two-dimensional vector, by defining every value of the 2-D vector as the ‘row’ created in the last statement.

在理解了上述过程之后,我们可以通过以下方式来改进我们在C++中对二维向量的初始化方法:

#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;
	}					   
}

由于我们在代码中进行了完全相同的操作,只是用一行代码实现,所以以上代码将产生与之前类似的输出结果。

如果我们记得没错的话,标准的初始化看起来有点像上面的那个。创建一个二维向量需要我们将每个元素的默认值设置为一个单维向量。

最后一种方法是在不知道行或列的情况下创建一个二维向量。这个方法是通过以下步骤完成的:

vector<vector<int>> v;

上述声明创建了一个空容器,该容器能够以向量形式存储元素。


二维向量的迭代器

不再使用索引来遍历二维向量,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()’ – It returns an iterator to the first vector in a 2-D vector.
  • ‘v.end()’ – It returns an iterator to the end of the 2-D vector.

让我们来看一些可以在二维向量上进行的操作。


将元素添加到一个二维向量中

在二维向量的末尾添加元素时,我们使用’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;
	}					   
}

输出:

1 0 1 
0 1 
1 0 1 

由于我们的容器是一个向量的向量,因此只有将完整的向量推入其中才有意义。因此,在’push_back()’函数中传递的参数必须是一个向量。

注意:’v[i]’代表一个一维向量。因此,如果程序员需要在2-D向量内的某个向量中添加元素,他可以使用’v[i].push_back(value)’。

为了在特定位置添加完整的向量,我们使用“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;
	}				   
}

输出:

1 0 1 
1 2 3 
0 1 
1 0 1 

‘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;
	}				   
}

结果:

1 0 1 
0 1 

除了’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;
	}				   
}

输出:

1 0 1 
1 0 1 

与’insert()’函数类似,它需要一个可迭代的位置参数。要从2-D向量中删除所有向量,可以使用’clear()’函数。

在使用C++中的2D向量时,以上功能可能足够让您感到舒适。


结论

只要程序员了解相关的语法,C++中的二维向量非常容易使用。这种向量在解决与矩阵、图形和其他二维对象有关的问题时非常方便。

希望本教程能够让读者对使用二维向量有所启发。如有任何关于该主题的问题,请随时在下方评论区留下评论。

广告
将在 10 秒后关闭
bannerAds