1. 程式人生 > >C++結構體排序個人總結(運算子重定義,比較器)

C++結構體排序個人總結(運算子重定義,比較器)

前幾天做藍橋杯題目有一題有用到結構體排序,剛開始使用比較器,然後sort()排序一下就可以,後來參考別人的程式碼發現還可以用運算子重定義,著實省事很多,省的再在結構體外面寫一個比較器的方法,所以現在總結一下:

第一種:結構體內重定義 (‘  <  ’符號),然後sort就可以排序

#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;
}
執行結果:升序(降序只需要改成 rank  > n.rank

第二種:比較器(結構體外定義比較器,然後呼叫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;
}