我想知道为什么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);
}
}
假设 amap
有两个对象,带有键key1
和key2
。现在我们要插入另一个带有 key 的对象key3
。
使用std::less
时,insert
函数需要先std::less::operator()
用key1
and调用key3
。假设std::less::operator()(key1, key3)
返回假。它必须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
compare
std::less