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;
}
文章目录