Учитывая итератор, можно ли получить/использовать правильную функцию сравнения для коллекции, к которой относится этот итератор?
Например, допустим, что я пишу общий алгоритм:
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== для содержащихся в нем элементов - я отлично справляюсь с возможностью использования этого.