Учитывая итератор, можно ли получить/использовать правильную функцию сравнения для коллекции, к которой относится этот итератор?
Например, допустим, что я пишу общий алгоритм:
template <class InIt, class T>
void do_something(InIt b, InIt e, T v) {
// ...
}
Теперь скажем, я хочу сделать что-то простое, например find v
в [b..e)
. Если b
и e
являются итераторами над std::vector
, я могу просто использовать if (*b == v) ...
. Предположим, однако, что b
и e
являются итераторами над a std::map
. В этом случае я должен сравнивать только ключи, а не весь тип значения того, что содержится на карте.
Итак, вопрос в том, что, учитывая эти итераторы на карте, как мне получить эту функцию сопоставления карт, которая будет сравнивать только ключи? В то же время я не хочу слепо предположить, что я работаю с map
. Например, если итераторы указали на set
, я бы хотел использовать функцию сравнения, определенную для этого set
. Если они указали на vector
или deque
, мне, вероятно, придется использовать ==
, потому что в этих контейнерах не будет определена функция сравнения.
О, почти забыл: я понимаю, что во многих случаях у контейнера будет только эквивалент operator<
, а не operator==
для содержащихся в нем элементов - я отлично справляюсь с возможностью использования этого.