【发布时间】:2014-04-14 01:03:57
【问题描述】:
我想知道为什么 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函数需要先用key1和key3调用std::less::operator()。假设 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,则只需一次调用即可获得足够的信息来做出正确的决定。
根据 map 中键的类型,std::less::operator()(key1, key2) 可能很昂贵。
除非我遗漏了一些非常基本的东西,否则std::map 和std::set 不应该使用类似compare 而不是std::less 作为比较键的默认函子吗?
【问题讨论】:
-
Doesnt
std::set和std::map是底层的 RB-Trees? -
但这意味着必须为任何希望使用映射或集合的数据类型重载
-运算符 -
@Smac89,这是真的。同样正确的是你现在必须实现
operator<。 -
@Paranaix 我认为这在技术上是一个实现细节。但是,如果您深入到标准规范的底部,您可能会发现很难找到另一个仍然满足标准 的性能限制的实现指定。
-
@Paranaix,该标准不要求任何特定的结构,只是性能保证。