当前位置: 首页 > 知识库问答 >
问题:

Cpriority_queue使用map与lambda比较器错误

崔涵亮
2023-03-14

我正在尝试为std::proirity\u队列实现我自己的密钥比较器,如下所示:

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行:Char 23:错误:将“const std::map”作为“this”参数传递将丢弃限定符[-fppermissive]返回m[a]

共有3个答案

须捷
2023-03-14

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

   auto comp = [m]( int a, int b ) 
   { 
        return m[a] < m[b]; 
   };
董小林
2023-03-14

如果lamdba错了,您需要比较这两个参数或捕获变量

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

或:

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

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

贝研
2023-03-14

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

[&m]

那里?

接下来,如果搜索std::map的操作符[],您会发现这只能在非常量映射上操作(https://en.cppreference.com/w/cpp/container/map/operator_at)。您的lambda可能会被常量映射调用。因此,请尝试使用

return m.at(a) < m.at(b);
 类似资料:
  • 这个问题最近在一次采访中被问到。 这是我使用的以下方法 1)创建一个最大堆priority_queue来存储最近的点

  • 我想用Lambda对列表排序: 但我得到了这个编译错误:

  • 问题内容: 我想用Lambda排序列表: 但是我得到了这个编译错误: 问题答案: 返回一个; 而显然是。 这样写会更好:

  • 日安- 我正在处理一个任务,在该任务中,我有指令来创建一个名为的方法,该方法将执行以下任务: public int compare(Object first,Object second)(请注意,您还可以定义:public int compare(Attory first,Attory second),方法是让类 为此,我创建了一个类,如下所示: AthletenameComparator

  • 问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通

  • 我仍在学习这方面的诀窍,但我正在尝试为HashMap实现一个比较器,以便使用compareTo对键进行排序。为了使比较器与equals保持一致,我想尝试从compareTo获取int结果,看看它是否等于0。如果是,请检查对象是否相等。我遇到的问题是,如果对象不相等,会发生什么?我必须归还什么?