C ++ priority_queue используя карту с ошибкой лямбда-компаратора - PullRequest
3 голосов
/ 21 июня 2019

Я пытаюсь реализовать свой собственный ключевой компаратор для 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);
}

Но ошибка выдачи:

В лямбда-функции: Строка 10: Char 23: ошибка: передача 'const std :: map' в качестве аргумента 'this' отбрасывает квалификаторы [-fpermissive] возврат m [a]

Ответы [ 3 ]

1 голос
/ 21 июня 2019

Вы lamdba не правы, вам нужно либо сравнить два аргумента, либо захватить переменную m.

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

Или:

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

Это зависит от того, что именно вы хотите сделать.

1 голос
/ 21 июня 2019

Во-первых, ваш список захвата вашей лямбды (квадратные скобки) пуст, я думаю, там должно быть

[&m]

?

Далее, если вы ищете оператора [] из std :: map, вы обнаружите, что это может работать только на неконстантных картах (https://en.cppreference.com/w/cpp/container/map/operator_at). Возможно, вместо этого ваша лямбда вызывается с константной картой. Поэтому попробуйте использовать

return m.at(a) < m.at(b);
0 голосов
/ 21 июня 2019

Я думаю, m неизвестно в контексте вашей лямбды.Вы должны передать его как плен :

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