C++中二维向量使用及排序

2、定义vector数组:

上面这个定义其实相当于是一维数组 name[SIZE],只不过其长度可以根据需要进行变化。

和一维数组一样,这里的 typename 可以是任何基本类型,例如 int、double、 char、 结构体 等,也可以是STL标准容器,例如 vector、set、 queue 等。

//可以很容易联想到二维数组的定义,即其中一维是一个数组的数组。
vector<vector<typename> > name;
//c++11之前会将>>视为移位操作,所以要加空格> >
vector<typename> Arrayname[arraySize];
//例如:
vector<int> vi[100];

vector<vector<typename> > name; 两个维都可变长
vector<typename> Arrayname[arraySize]; 一维长度已经固定为 arraySize,另一维才是“变长”的。

【定义】

要加一个空格。

vector<vector<int>> A;//错误的定义方式
vector<vector<int> > A;//正确的定义方式

【插入】

二维数组是我们假象的,其实是连续的内存地址。

现在若想定义A = [ [0,1,2] , [3,4,5] , [2,3,9] , [6,1,10] ],则:

//正确的插入方式
vector<vector<int> > A;
//A.push_back里必须是vector
vector<int> B;
B.push_back(0);
B.push_back(1);
B.push_back(2);
A.push_back(B);
B.clear();	//清空B
B.push_back(3);
B.push_back(4);
B.push_back(5);
A.push_back(B);
B.clear();	//清空B
B.push_back(2);
B.push_back(3);
B.push_back(9);
A.push_back(B);
B.clear();	//清空B
B.push_back(6);
B.push_back(1);
B.push_back(10);
A.push_back(B);
B.clear();
//错误的插入方式
vector<vector<int> > A;
A[0].push_back(0);
A[0].push_back(1);
A[0].push_back(2);
A[1].push_back(3);
A[1].push_back(4);
A[1].push_back(5);
A[2].push_back(2);
A[2].push_back(3);
A[2].push_back(9);
A[3].push_back(6);
A[3].push_back(1);
A[3].push_back(10);

【长度】

//vector<vector<int> >A中的vector元素的个数
len = A.size();
//vector<vector<int> >A中第i个vector元素的长度
len = A[i].size();

【访问某元素】

访问某元素时,方法和二维数组相同,例如:

//根据前面的插入,可知输出5
printf("%d\n", A[1][2]);

【排序】

一维向量的排序我们都会,可以自定义cmp函数或less/greater来告诉编译器我们想要的排序顺序。

#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
	//初始化
	vector<int> v;
	v.push_back(2);
	v.push_back(0);
	v.push_back(1);
	v.push_back(5);
	v.push_back(9);

	//升序(默认) Ascending order 
	sort(v.begin(), v.end());
	for(int i=0;i<v.size();i++)
		printf("%d ",v[i]);
	printf("\n");
	
	//升序 Ascending order 
	sort(v.begin(), v.end(), less<int>());
	for(int i=0;i<v.size();i++)
		printf("%d ",v[i]);
	printf("\n");
	
	//降序 Descending order
	sort(v.rbegin(), v.rend());
	for(int i=0;i<v.size();i++)
		printf("%d ",v[i]);
	printf("\n");
	
	//降序 Descending order
	sort(v.begin(), v.end(), greater<int>());
	for(int i=0;i<v.size();i++)
		printf("%d ",v[i]);
	printf("\n");
	
	return 0;
}

如果是一个二维数组,也可以用sort,默认的是根据第一列来排序,当然我们可以重写cmp函数来根据其他列来排序:
A = [ [0,1,2] , [3,4,5] , [2,3,9] , [6,1,10] ]

#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
 
int main()
{
	//正确的插入方式
	vector<vector<int> > A;
	//A.push_back里必须是vector
	vector<int> B;
	B.push_back(0);
	B.push_back(1);
	B.push_back(2);
	A.push_back(B);
	B.clear();	//清空B
	B.push_back(3);
	B.push_back(4);
	B.push_back(5);
	A.push_back(B);
	B.clear();	//清空B
	B.push_back(2);
	B.push_back(3);
	B.push_back(9);
	A.push_back(B);
	B.clear();	//清空B
	B.push_back(6);
	B.push_back(1);
	B.push_back(10);
	A.push_back(B);
	B.clear();
	
	//按第一列升序,Ascending order by first column
	sort(A.begin(), A.end());
	for(int i=0;i<A.size();i++)
	{
		for(int j=0;j<A[i].size();j++)
			printf("%d ",A[i][j]);
		printf("\n");
	}
	
	printf("\n\n");
	
	//按第一列降序,Descending order by first column
	sort(A.rbegin(), A.rend());
	for(int i=0;i<A.size();i++)
	{
		for(int j=0;j<A[i].size();j++)
			printf("%d ",A[i][j]);
		printf("\n");
	}
		
	return 0;
}

#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

bool cmp1(const vector<int> &a, const vector<int> &b) {
    return a[1] < b[1];
}

bool cmp2(const vector<int> &a, const vector<int> &b) {
    return a[1] > b[1];
}

int main()
{
	//正确的插入方式
	vector<vector<int> > A;
	//A.push_back里必须是vector
	vector<int> B;
	B.push_back(0);
	B.push_back(1);
	B.push_back(2);
	A.push_back(B);
	B.clear();	//清空B
	B.push_back(3);
	B.push_back(4);
	B.push_back(5);
	A.push_back(B);
	B.clear();	//清空B
	B.push_back(2);
	B.push_back(3);
	B.push_back(9);
	A.push_back(B);
	B.clear();	//清空B
	B.push_back(6);
	B.push_back(1);
	B.push_back(10);
	A.push_back(B);
	B.clear();
	
	//按第二列升序,Ascending order by second column
	sort(A.begin(), A.end(), cmp1);
	for(int i=0;i<A.size();i++)
	{
		for(int j=0;j<A[i].size();j++)
			printf("%d ",A[i][j]);
		printf("\n");
	}
	
	printf("\n\n");
	
	//按第二列降序,Descending order by second column
	sort(A.begin(), A.end(), cmp2);
	for(int i=0;i<A.size();i++)
	{
		for(int j=0;j<A[i].size();j++)
			printf("%d ",A[i][j]);
		printf("\n");
	}
		
	return 0;
}
  • 13
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值