C++ priority_queue使用带有 lambda 比较器错误的映射
C++ priority_queue using map with lambda comparator error
我正在尝试为 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];
};
相关文章:
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- C++ priority_queue使用带有 lambda 比较器错误的映射
- 在 lambda 比较器中使用捕获
- 如何在不使用 lambda 表达式的情况下实现特定的比较器
- 映射的 Lambda 键比较器
- 你能用lambda比较器交换std::队列吗
- 在映射中使用reference-to-lambda作为比较器(正确的方式?)
- 使用c++ std::sort与lambda比较器
- 带有lambda比较器的c++ priority_queue错误