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