Мне интересно, почему std::map
и std::set
используют std::less
как функтор по умолчанию для сравнения ключей. Почему бы не использовать функтор, который работает аналогично strcmp? Что-то вроде:
template <typename T> struct compare
{
// Return less than 0 if lhs < rhs
// Return 0 if lhs == rhs
// Return greater than 0 if lhs > rhs
int operator()(T const& lhs, T const& rhs)
{
return (lhs-rhs);
}
}
Скажите, что map
имеет в нем два объекта с ключами key1
и key2
. Теперь мы хотим вставить другой объект с ключом key3
.
При использовании std::less
функция insert
должна сначала вызвать std::less::operator()
с помощью key1
и key3
. Предположим, что std::less::operator()(key1, key3)
возвращает false. Он должен снова вызвать std::less::operator()
с помощью переключаемых клавиш std::less::operator()(key3, key1)
, чтобы решить, равен ли key1
key3
или key3
больше, чем key1
. Для принятия решения, если первый вызов возвращает false, есть два вызова std::less::operator()
.
Если бы std::map::insert
использовал compare
, то было бы достаточно информации, чтобы принять правильное решение, используя только один вызов.
В зависимости от типа ключа на карте std::less::operator()(key1, key2)
может быть дорогостоящим.
Если мне не хватает чего-то очень простого, не следует std::map
и std::set
использовать вместо std::less
что-то вроде compare
как функтор по умолчанию для сравнения ключей?