C++結構體排序個人總結(運算子重定義,比較器)
阿新 • • 發佈:2018-12-31
前幾天做藍橋杯題目有一題有用到結構體排序,剛開始使用比較器,然後sort()排序一下就可以,後來參考別人的程式碼發現還可以用運算子重定義,著實省事很多,省的再在結構體外面寫一個比較器的方法,所以現在總結一下:
第一種:結構體內重定義 (‘ < ’符號),然後sort就可以排序
執行結果:升序(降序只需要改成 rank > n.rank)#include"iostream" #include"algorithm" using namespace std; struct Node{ int rank; bool operator<(const Node& n)const{//運算子重定義 return rank < n.rank;// rank > n.rank 降序 rank < n.rank 降序 } }node[3]; int main(){ int n = 3; for(int i = 0;i < n;i++) node[i].rank = i; sort(node,node + n); for(int i = 0;i < n;i++) cout << node[i].rank << endl; return 0; }
第二種:比較器(結構體外定義比較器,然後呼叫sort時把相應的比較器輸入)
執行結果同上#include"iostream" #include"algorithm" #include"vector" using namespace std; struct Node{ int rank; bool operator<(const Node& n)const{//運算子重定義 return rank < n.rank;// rank > n.rank 降序 rank < n.rank 降序 } }node[3]; bool cmp(Node a,Node b){//比較器寫法1 return a.rank > b.rank;//排序規則同上 } bool cmp_const(const Node& a,const Node& b){//比較器寫法2 return a.rank > b.rank; } int main(){ int n = 3; for(int i = 0;i < n;i++) node[i].rank = i; sort(node, node + n,cmp_const); for(int i = 0;i < n;i++) cout << node[i].rank << endl; return 0; }
因為主修的不是C++,所以關於寫法1,寫法2有什麼區別還不清楚,等過兩天問老師才知道,但是執行結果一樣
寫法1,2的區別
為了限定隱含的this指標,
即這個成員函式不能修改其資料成員
一般在類中這樣用,這個成員函式的功能多數是get資料成員,即獲得物件的某個資料,只讀不寫相關文章連線
應用:vector排序應用
#include"iostream" #include"algorithm" #include"vector" using namespace std; struct Node{ int rank; bool operator<(const Node& n)const{//運算子重定義 return rank > n.rank;// rank > n.rank 降序 rank < n.rank 降序 } }node[3]; bool cmp(Node a,Node b){//比較器寫法1 return a.rank > b.rank;//排序規則同上 } bool cmp_const(const Node& a,const Node& b){//比較器寫法2 return a.rank > b.rank; } int main(){ vector<Node> v; int n = 3; for(int i = 0;i < n;i++) node[i].rank = i; for(int i = 0;i < n;i++) v.push_back(node[i]); sort(v.begin(), v.end());//操作符重定義 //sort(v.begin(), v.end(),cmp);//比較器1 //sort(v.begin(), v.end(),cmp_const);//比較器2 for(int i = 0;i < n;i++) cout << v[i].rank << endl; return 0; }