Создать набор с пользовательским компаратором, переданным как лямбда - PullRequest
0 голосов
/ 19 апреля 2020

Я писал решение для этого , и мне нужно было создать set, ну на самом деле unordered_map от int до моего пользовательского set, без лишних слов, это то, что я придумал whith:

auto comparator = [](pair<int, int> a, pair<int, int> b) {return a.second == b.second ? a.first < b.first : a.second < b.second; };
unordered_map<int, set < pair<int, int>,decltype(comparator) >> H;

Остальная часть кода не имеет значения. Здесь компилятор жалуется, что

"Severity   Code    Description Project File    Line    Suppression State
<lambda_6dd753bdcbaf959c162af7914f0815bf>(void)': attempting to reference a deleted function"

Может кто-нибудь, пожалуйста, опишите, что компилятор пытается сказать мне, или даже лучше, если вы могли бы намекнуть, что я сделал неправильно. Заранее спасибо.

1 Ответ

2 голосов
/ 19 апреля 2020

Он говорит вам, что ему нужно вызвать c 'по умолчанию для того лямбда-типа, который вы определили. Однако только в C ++ 20 и более поздних версиях лямбда без захвата является конструируемой по умолчанию. До этого все лямбды не могут быть созданы по умолчанию, они возникают только из соответствующего лямбда-выражения (или, конечно, копируются).

Я рекомендую использовать для этого пользовательский тип функтора.

struct Comparator {
  bool operator()(pair<int, int> a, pair<int, int> b) 
  { return a.second == b.second ? a.first < b.first : a.second < b.second; };
};

unordered_map<int, set < pair<int, int>, Comparator  >> H;
...