C++二維數組sort排序問題

以往遇到行排列問題(按每行的字典序排序)的時候,老是使用結構體來進行排序,可是如何使用二維數組來達到一樣的效果呢?ios

實驗內容:利用二維數組進行「三級排序」c++

測試1:使用c++內置的普通型二維數組數組

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

bool cmp(int a[], int b[])
{
	if(a[0] != b[0]) return a[0] > b[0];
	if(a[1] != b[1]) return a[1] > b[1];
	if(a[2] != b[2]) return a[2] > b[2];
}

int main()
{
	int a[6][3] = { {1,4,3}, {1,4,7} , {1,3,5} , {2,9,4} , {2,5,8} , {3,9,6} };

	//sort(a, a + 6, cmp);			//編譯器直接報錯。。 
	sort((int**)a, (int**)(a+6), cmp);
	
	for(int i = 0; i < 6; ++i)
		cout<<a[i][0]<<' '<<a[i][1]<<' '<<a[i][2]<<endl;

	return 0;
}


沒想到,兩次嘗試都以失敗了結。分析緣由,應該是數組名a和一維數組名a[0]、a[1]均爲const類型指針,排序時沒法交換它們而致使錯誤。//我也不太肯定測試

測試2:動態建立二維數組spa

這樣看起來就能夠避免測試1中的種種問題了,代碼以下:指針

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

bool cmp(int a[],int b[])
{
	if(a[0] != b[0]) return a[0] > b[0];
	if(a[1] != b[1]) return a[1] > b[1];
	if(a[2] != b[2]) return a[2] > b[2];
}

int main()
{
	int a[6] = {1, 1, 1, 2, 2, 3};		//儲存re[i][0] 
	int b[6] = {4, 4, 3, 9, 5, 9};		//儲存re[i][1] 
	int c[6] = {3, 7, 5, 4, 8, 6};		//儲存re[i][2] 
	int i;
	
	int **re = new int*[6];		//動態建立二維數組 
	for (i = 0; i < 6; ++i)
	{
		re[i] = new int[3];
		re[i][0] = a[i];
		re[i][1] = b[i];
		re[i][2] = c[i];
	}
	
	sort(re, re + 6, cmp);		//排序後輸出 
	for(i = 0; i < 6; ++i)
		cout << re[i][0] << ' ' << re[i][1] << ' ' << re[i][2] << endl;

	return 0;
}

雖然過程有些麻煩,可是總算獲得了預期的結果。


測試3:利用STL中的vector容器進行排序c++11

即利用vector<vector<int>>容器模擬二維數組進行排序code

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

bool cmp(vector<int> a, vector<int> b)
{
	if(a[0] != b[0]) return a[0] > b[0];
	if(a[1] != b[1]) return a[1] > b[1];
	if(a[2] != b[2]) return a[2] > b[2];
}

int main()
{
	vector<vector<int>> vec = { {1,4,3}, {1,4,7} , {1,3,5} , {2,9,4} , {2,5,8} , {3,9,6} };
	
	sort(vec.begin(), vec.end(), cmp);

	for(auto p : vec)
		cout<<p[0]<<' '<<p[1]<<' '<<p[2]<<endl;

	return 0;
}

看起來好像STL方便一些~blog

總結:利用二維數組進行排序仍是挺麻煩的,之後仍是用結構體吧(逃...排序

編譯器:Devcpp(設置支持c++11)