为multiset定义自定义比较

时间:2016-09-02 10:03:55

标签: c++ function lambda stl decltype

function<bool(const pair<int, int>&, const pair<int, int>&)> cmp = [](const pair<int, int> & left, const pair<int, int> & right){if(left > right) return true;};

//multiset<pair<int, int>, function<bool(const pair<int, int>&, const pair<int, int>&)> mt(cmp);
multiset<pair<int, int>, decltype(cmp)> mt1(cmp);

cout<<typeid(decltype(cmp)).name()<<endl<<typeid(cmp).name()<<endl;

评论代码(mt)会出错,而下面的行(mt1)会赢得

我尝试cout两种类型的名称,它们是相同的。

此外,我也尝试过这样:

multiset<pair<int, int>, const function<bool(const pair<int, int>&, const pair<int, int>&) &> mt(cmp);

multiset<pair<int, int>, function<bool(const pair<int, int>&, const pair<int, int>&) &> mt(cmp);

他们都不能工作。

那么第二个参数的类型到底是什么?如果我不使用decltype,我该如何申报呢?

2 个答案:

答案 0 :(得分:0)

仔细查看代码,您丢失了>

multiset<pair<int, int>, function<bool(const pair<int, int>&, const pair<int, int>&)>> mt(cmp);
//                                                                                   ~

使用decltype应该是一个好主意。

BTW:当if在lambda中返回false时,你应该返回一些内容。或者只是return left > right;

答案 1 :(得分:0)

这三个多重集合表现出等效的排序行为:

#include <iostream>
#include <functional>
#include <set>
#include <utility>
#include <typeinfo>

using namespace std;

auto cmp = [](const pair<int, int> & left, 
              const pair<int, int> & right)
{
  return left > right;
};

multiset<pair<int, int>, decltype(cmp)> mt1(cmp);
multiset<pair<int, int>, std::greater<>> mt2;
multiset<pair<int, int>, std::function<bool(const pair<int, int>&, const pair<int, int>&)>> mt3(cmp);

int main()
{
  mt1.insert(std::make_pair(1,2));
  mt2.insert(std::make_pair(1,2));
  mt3.insert(std::make_pair(1,2));
}

在这三者中,我强烈建议选择这一个:

multiset<pair<int, int>, std::greater<>> mt2;