Использование функции сравнения в контейнере STL
-
10-10-2019 - |
Вопрос
Почему я могу сделать это:
stable_sort(it1, it2, binary_function);
но не это:
priority_queue<type, vector<type>, binary_function> pq;
Почему я могу использовать функцию в первом случае, но нужен объект во втором?
Решение
Если вы проверите ссылку на std::stable_sort
, вы увидите, что binary_function
Вы предоставили, также должен быть функциональным объектом ... нет никакой разницы между ними, за исключением того, что, возможно, во втором случае нет правильного «актера» или преобразования, сделанного от функции в правильный объект функции.
Я считаю, что это может быть связано с тем, что *sort
функции используют функтор непосредственно и сразу же, таким образом, если адрес функции действителен, когда *sort
Функция вызывается, она будет действительной для продолжительности вызова функции. При создании контейнера, который использует его в качестве члена данных (по сути), вы не можете быть уверены, что ссылка на функцию будет недействительной в течение времени жизни объекта контейнера. Я знаю, что это свободное объяснение рук, но это лучшее, что я могу придумать. Возможно, в C ++ ссылка на бинарную функцию будет значительно преобразована в конструкцию std::function
так что функция «скопирована», и нет никакой проблемы достоверности.
Надеюсь, я не потерял тебя сейчас ...
Другие советы
priority_queue
это шаблон, и он ожидает типа как аргумент, где binary_function
является функциональным объектом.