为multiset定义一个自定义的Compare

define a custom Compare for multiset

本文关键字:一个 自定义 Compare multiset 定义      更新时间:2023-10-16
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,我怎么申报?

仔细看看你的代码,你丢失了一个>

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

使用decltype应该是个好主意。

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

这三个多集表现出等价的排序行为:

#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;