C ++ priority_queue使用带有Lambda比较器错误的映射

时间:2019-06-21 13:20:46

标签: c++ dictionary lambda comparator priority-queue

我正在尝试为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]

3 个答案:

答案 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]; 
   };