我正在使用priority_queue
的自定义比较器,找到不同的行为。我已经知道stl容器需要传递给模板声明的特定类型。
使用普通函数时,它应该是:
bool cmp(pair<int, int> &lhs, pair<int, int> &rhs) {
return lhs.first > rhs.first;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> pq1(v.begin(), v.end(), cmp);
但是当使用lambda时,我发现正确的方法是:
auto comp = [](const pair<int, int>& lhs, const pair<int, int>& rhs){return lhs.second < rhs.second;};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> pq2(v.begin(), v.end(), comp);
我提到了decltype,但没有提出意见。有人可以解释编译器如何处理decltype(&function)
和decltype(lambda)
?
答案 0 :(得分:2)
那是因为lambda expressions创建了对象(匿名类)。
如果使用&comp
,则会得到一个指向该对象的指针,该指针不可调用。
你拥有的lambda基本上相当于
struct
{
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs)
{
return lhs.second < rhs.second;
}
} comp;