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
,我该如何申报呢?
答案 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;