class mycomparison {
public:
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison>pri_que;
priority_queue<pair<int,int>,vector<pair<int,int>>,[](pair<int,int>&map1,pair<int,int>&map2)
{return map1.second>map2.second;} >pri_que;
error: a lambda expression cannot appear in this context
priority_queue<pair<int,int>,vector<pair<int,int>>,[](pair<int,int>&map1,pair<int,int>&map2)
构造方法用错了,你l放ambda的地方应该放functype而不是func本身:
#include <queue>
#include <vector>
auto main() -> int
{
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
std::function<bool(std::pair<int, int> & map1,
std::pair<int, int> & map2)>>
pri_que([](std::pair<int, int> &map1, std::pair<int, int> &map2) -> bool {
return map1.second > map2.second;
});
}
Your code is valid C++20 as written but invalid C++11.
可能你使用了c++20的特性,在c++11下不支持吧,可以测试下在c++20下是否有问题。若真是这样,只能换种写法了。
参考这个回答:
C++: lambda-expression in unevaluated context
1.Lambda expressions are not allowed in unevaluated contexts (such as decltype) before C++20.
2.Closure types are not default constructible before C++20. In C++20 a closure type that has no capture is default constructible.
我在c++20下面做了个测试,证明确实是这个问题:
#include <iostream>
#include <charconv>
#include <array>
#include <system_error>
#include <queue>
int main() {
std::cout << "hello test" << std::endl;
using Ty = std::pair<std::string,int>;
std::priority_queue<Ty,
std::vector<Ty>,
decltype( [](Ty a, Ty b)->bool{
return a.second > b.second;
})> q;
q.emplace(std::make_pair("yang",3));
q.emplace(std::make_pair("yong",2));
q.emplace(std::make_pair("zhen",1));
std::cout << "q.top()=" <<q.top().first <<std::endl;
return 0;
}
可以跑下这个代码,在c++ 20下面是ok的。但在c++17下则会报错:
test2.cpp:28:19: error: lambda-expression in unevaluated context
decltype( [](Ty a, Ty b)->bool{
^
test2.cpp:30:11: error: template argument 3 is invalid
})> q;
在c++20下面的测试: