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