Зачем использовать std :: less в качестве функтора по умолчанию для сравнения ключей в std :: map и std :: set?

Мне интересно почему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) возвращает ложь Это должно позвонитьstd::less::operator() снова с переключенными ключами,std::less::operator()(key3, key1), чтобы решить,key1 равноkey3 или жеkey3 больше, чемkey1, Есть два звонкаstd::less::operator() принять решение, если первый вызов возвращает ложь.

Имелstd::map::insert используемыйcompare, было бы достаточно информации, чтобы принять правильное решение, используя только один звонок.

В зависимости от типа ключа на карте,std::less::operator()(key1, key2) может быть дорогим.

Если я не пропустил что-то очень простое, не долженstd::map а такжеstd::set использовать что-то вродеcompare вместоstd::less в качестве функтора по умолчанию для сравнения ключей?

Ответы на вопрос(2)

Ваш ответ на вопрос