c++ set 重载比较运算符 cmp
参考博客:https://www.codenong.com/2620862/
最终是使用的一个包含了operator ()函数的struct结构体来实现的cmp定义。
其中可以用lambda和decltype来简写,但本质不变。
基本写法:
#include <iostream>
#include <string>
#include <set>
using namespace std;
class A {
public:
A(int n) :_n(n) {};
int _n;
};
struct cmp {
bool operator () (const A* a, const A*b) {
return a->_n < b->_n;
}
};
void addPoint(set<const A*, cmp>& s, const A& a) {
s.insert(&a);
}
int main() {
set<const A*, cmp> s;
A a(1);
A b(2);
A c(3);
addPoint(s, a);
addPoint(s, b);
addPoint(s, c);
addPoint(s, a);
set<const A*>::iterator it;
for(it=s.begin();it!=s.end();++it) {
cout<<*it<<endl;
cout<<(*it)->_n<<endl;
}
return 0;
}
简写法:
#include <iostream>
#include <string>
#include <set>
using namespace std;
class A {
public:
A(int n) :_n(n) {};
int _n;
};
auto cmp = [](const A* a, const A* b) { return a->_n < b->_n; };
void addPoint(set<const A*, decltype(cmp)>& s, const A& a) {
s.insert(&a);
}
int main() {
set<const A*, decltype(cmp)> s(cmp);
A a(1);
A b(2);
A c(3);
addPoint(s, a);
addPoint(s, b);
addPoint(s, c);
addPoint(s, a);
set<const A*, decltype(cmp)>::iterator it;
for(it=s.begin();it!=s.end();++it) {
cout<<*it<<endl;
cout<<(*it)->_n<<endl;
}
return 0;
}