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