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

C++ priority_queue using map with lambda comparator error

我正在尝试为 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] return m[a] < m[b];

我认为 m 在您的 lambda 上下文中是未知的。您必须将其作为 capture:

传递
   auto comp = [m]( int a, int b ) 
   { 
        return m[a] < m[b]; 
   };

你的 lambda 是错误的,你要么需要比较两个参数,要么捕获 m 变量。

auto comp = []( int a, int b ) 
{ 
     return a < b; 
};

或者:

auto comp = [m]( int a, int b ) 
{ 
     return m[a] < m[b]; 
};

这取决于你到底想做什么。

首先,你的lambda捕获列表(方括号)是空的,我想应该有

[&m]

有吗?

接下来,如果搜索std::map的operator[],会发现这个只能对non-const张图(https://en.cppreference.com/w/cpp/container/map/operator_at)进行操作。您的 lambda 很可能是使用 const 映射调用的。所以尝试使用

return m.at(a) < m.at(b);