Функциональные классы как компаратор - PullRequest
3 голосов
/ 14 февраля 2020

1) Если я хочу, чтобы набор сохранял элементы в порядке убывания, я мог бы написать:

set<int, greater<int>> s;

, но я также могу

set<int, greater<>> s;

как это понимает компилятор?

2) Почему в следующем случае

vector<int> a;
binary_search(a.begin(), a.end(), 5, greater<>());

мне нужно написать больше <> () вместо больше <> . Это имеет какую-то причину, почему это нельзя сделать везде одинаково?

1 Ответ

6 голосов
/ 14 февраля 2020

1) как это понимает компилятор?

Поскольку начиная с C ++ 14 параметр шаблона T из std::greater имеет значение по умолчанию значение void; тогда std::greater<> точно так же, как std::greater<void>.

Стандартная библиотека обеспечивает специализацию std::greater, когда T не указан, что оставляет типы параметров и возвращаемый тип для вывод.

и

2) У этого есть какая-то причина, почему это нельзя сделать везде одинаково?

Потому что binary_search является функцией и ожидает своего аргумента в качестве объекта. greater<> (то есть greater<void>) - это тип , а greater<>() - это объект (который является временным объектом в контексте binary_search(a.begin(), a.end(), 5, greater<>());).

Кстати: в set<int, greater<>> s; вы указываете greater<> в качестве аргумента шаблона. Второй параметр шаблона std::set является параметром шаблона типа , тогда можно указать greater<> (который является типом ) в качестве аргумента шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...