C++ 自定義二元謂詞函式的寫法
阿新 • • 發佈:2019-02-20
對於優先順序佇列priority_queue,注意預設的是less函式,優先順序佇列是大數在佇列頭,若想要小數在佇列頭部,需要greater。
但是對於自定義的二元謂詞函式應該是過載()運算子,或者使用仿函式
struct cmp
{
bool operator()(pair<int, int>& a, pair<int, int>& b)
{
if (a.first == b.first)
return a.second > b.second;
else
return a.second < b.second;
}
};
int main()
{
priority_queue<pair<int, int>, vector<pair<int,int>>, cmp> que;
}
對於set應該這麼寫:
需要注意的是set預設使用less得到的將是從小到大的排列,使用great得到的是從大到小的排列,這個和優先順序佇列相反
struct cmp
{
bool operator() (int a, int b)
{
if (a < b)
return true;
else
return false;
}
};
int main()
{
set<int, cmp> ss;
multiset<int, greater<int>> ms;
for (int i = 0; i < 10; i++)
{
ss.insert(i);
ms.insert(i);
ms.insert(i + 1);
}
for (int i : ss)
cout << i << " " ;
cout << endl;
for (int i : ms)
cout << i << " ";
cout << endl;
system("pause");
}
對於map呢?
需要注意的是cmp函式是const函式,所以後面的const是必須要的
參考這個部落格
[C/C++]map自定義比較函式
struct cmp
{
bool operator() (int a, int b) const
{
if (a < b)
return true;
else
return false;
}
};
int main()
{
map<int, int,cmp> mp;
multimap<int, int,cmp> mmp;
for (int i = 0; i < 10; i++)
mp[i] = i;
for (auto i : mp)
cout << i.first << " ";
cout << endl;
system("pause");
}
主要就是過載小於<運算子,注意這裡實在類中過載的
#include<iostream>
#include<stdio.h>
#include<map>
class A
{
public:
A(int a) :a_(a) {}
bool operator<(A BObj) const {
return a_<BObj.a_;
}
private:
int a_;
};
int main()
{
std::multimap<A, std::string> mapTest;
mapTest.insert(std::make_pair(A(4), "zsy"));
mapTest.insert(std::make_pair(A(2), "qwe"));
mapTest.insert(std::make_pair(A(1), "asd"));
mapTest.insert(std::make_pair(A(3), "qwe"));
auto it = mapTest.begin();
for (; it != mapTest.end(); it++)
{
printf("%s\n", it->second.c_str());
}
system("pause");
return 0;
}