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

C++ priority_queue using map with lambda comparator error

本文关键字:比较器 lambda 错误 映射 priority queue C++      更新时间:2023-10-16

我正在尝试为 std::p roirity_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"参数传递会丢弃限定符 [-permissive] 返回 m[a] <m[b];>

首先,您的lambda捕获列表(方括号(为空,我想应该有

[&m]

那里?

接下来,如果你搜索 std::map 的运算符 [],你会发现这只能在非常量映射 (https://en.cppreference.com/w/cpp/container/map/operator_at( 上运行。您的 lambda 可能会被调用 const 映射。所以尝试使用

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

你错了,你要么需要比较两个参数,要么需要捕获m变量。

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

或:

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

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

我认为在您的lambda上下文中m未知。您必须将其作为捕获传递:

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