我正在尝试为std :: proirity_queue实现自己的密钥比较器,如下所示:
funtion insertInPQ(vector<int> nums){
map<int,int> m;
for(int i=0;i<nums.size();i++)
m[nums[i]]++;
auto comp = []( int a, int b )
{
return m[a] < m[b];
};
priority_queue<int, vector<int>, decltype(comp)> pq(comp);
for(auto it=m.begin();it!=m.end();it++)
pq.push(it->first);
}
但是它给出了错误:
在lambda函数中:
第10行:字符23:错误:将“ const std :: map”作为“ this”参数传递会舍弃限定符[-fpermissive]
返回m [a]
答案 0 :(得分:1)
您认为lamdba是错误的,您需要比较两个参数或捕获m
变量。
auto comp = []( int a, int b )
{
return a < b;
};
或者:
auto comp = [m]( int a, int b )
{
return m[a] < m[b];
};
这取决于您要做什么。
答案 1 :(得分:1)
首先,您的lambda捕获列表(方括号)为空,我想应该是
[&m]
有吗?
接下来,如果您搜索std :: map的operator [],您将发现它只能在非const映射(https://en.cppreference.com/w/cpp/container/map/operator_at)上运行。您的lambda可能是用const映射代替的。因此,尝试使用
return m.at(a) < m.at(b);
答案 2 :(得分:0)
我认为m
在您的lambda上下文中是未知的。您必须将其作为capture传递:
auto comp = [m]( int a, int b )
{
return m[a] < m[b];
};