Мне интересно, почему 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 как функтор по умолчанию для сравнения ключей?