I am wondering why std::map
and std::set
use std::less
as the default functor to compare keys. Why not use a functor that works similar to strcmp? Something like:
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);
}
}
Say a map
has two object in it, with keys key1
and key2
. Now we want to insert another object with key key3
.
When using std::less
, the insert
function needs to first call std::less::operator()
with key1
and key3
. Assume std::less::operator()(key1, key3)
returns false. It has to call std::less::operator()
again with the keys switched, std::less::operator()(key3, key1)
, to decide whether key1
is equal to key3
or key3
is greater than key1
. There are two calls to std::less::operator()
to make a decision if the first call returns false.
Had std::map::insert
used compare
, there would be sufficient information to make the right decision using just one call.
Depending on the type of the key in map, std::less::operator()(key1, key2)
could be expensive.
Unless I am missing something very basic, shouldn't std::map
and std::set
use something like compare
instead of std::less
as the default functor to compare keys?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…