set中自定義比較函數
使用insert()將元素插入到集合中去的時候,集合會根據設定的比較函數將該元素放到該放的節點上去。在定義集合的時候,如果沒有
指定比較函數,那麼採用默認的比較函數(按鍵值又小到大的順序插入元素)。
編寫比較函數的兩張方法:
1.如果元素不是結構體,那麼可以編寫比較函數。
#include <iostream>
#include <set>
#include <iterator>
using namespace std;
//自定義比較函數myComp,重載操作符 ()
struct myComp
{
bool operator() (const int &a, const int &b)
{
return a > b; //從大到小排序
//return a < b; //從小到大排序
}
};
int main()
{
set<int, myComp> s1;
for(int i = 1; i < 6; i++)
s1.insert(i*i);
s1.insert(8);
//ostream_iterator<int> output(cout, " ");
set<int, myComp>::iterator it = s1.begin();
for(; it != s1.end(); it++)
{
cout<<*it<<" ";
}
return 0;
}
2.如果元素是結構體,那麼可以直接把比較函數寫在結構體內。
#include <iostream>
#include <set>
#include <iterator>
#include <string>
using namespace std;
struct Info
{
string name;
float score;
//重載操作符<,自定義排序規則
bool operator< (const Info &a)const
{
//return a.score < score; //按score由大到小排列
return a.score > score; //由小到大排列
}
};
int main()
{
set<Info> s;
Info info;
info.name = "Messi";
info.score = 8.5;
s.insert(info);
info.name = "Ronae";
info.score = 9.0;
s.insert(info);
info.name = "My";
info.score = 7.0;
s.insert(info);
info.name = "Perno";
info.score = 8.0;
s.insert(info);
info.name = "Arzar";
info.score = 8.5;
s.insert(info);
set<Info>::iterator it;
for(it = s.begin(); it != s.end(); it++)
{
cout<<it->name<<" : ";
cout<<(*it).score<<endl;
}
return 0;
}