Параметр Конструктора Сравнения карты

Есть ли причина, по которой я не могу передать функтор сравнения map в качестве аргумента конструктора:

map<int, string, greater<int>> foo;
//map<int, string> foo(greater<int>()); Doesn't work

Или почему я не могу передать лямбду, не предоставив свой собственный тип сравнения:

map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
//map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Doesn't work

Я хотел бы просто иметь возможность заявить map<int, string> и построить его с помощью компаратора. Почему я не могу?

[Живой пример]

0

Решение

Этот вопрос проистекает из неправильного представления. Чтобы прояснить это:

Функторы являются объектами не функции

Попытка присвоить объекту указатель на функцию или лямбду не имеет никакого смысла. Так что это не может быть сделано: map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Способ определить map который принимает указатель на функцию или лямбда, чтобы использовать аргументы шаблона из вопроса: map<int, string, function<bool(const int&, const int&)>>

На полпути между двумя непродуманными вариантами в вопросе есть еще одно заблуждение: map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }> Не работает, потому что аргумент шаблона компаратора является тип члена map, не значение инициализации. Так что map использование указателя функции или лямбда-компаратора всегда должно передавать это значение map конструктор: map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }) Иначе function<bool(const int&, const int&)>() будет использоваться для сравнения в map,

Это, вероятно, уже ясно сейчас, но поскольку функторы являются объектами, вы не можете передать несвязанный объект, это значение конструкции совершенно другого типа объекта. призвание map<int, string> foo(greater<int>()) это как звонить less<int> foo = greater<int>. Единственный допустимый аргумент конструктора компататора map чей аргумент шаблона компаратора является функтором, это то, что можно преобразовать в объект типа функтора в аргументе шаблона: map<int, string, greater<int>> foo(greater<int>{}) Это, очевидно, не нужно, потому что, если аргумент не был предоставлен и greater<int> по умолчанию был построен тот же элемент инициализации map приведет, так map<int, string, greater<int>> достаточно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]