C++ std::无序的_映射插入,带有提示

C++ std::无序的_映射插入,带有提示,c++,stl,c++11,C++,Stl,C++11,std::map有一个insert方法,该方法接受一个“提示”迭代器,如果提示正确,该迭代器将把插入时间从log(n)减少到常量时间。这一点非常明显,因为容器可以确保新添加的项具有小于提示的键,并且具有大于提示之前的项的键。否则,提示是错误的,它将执行正常插入 std::unordered_map也有类似的insert提示功能。如果有的话,提示有什么作用?我不清楚如何使用另一个“提示”迭代器来加速哈希映射插入 如果使用,什么是适当的“提示”。在std::map中,通常通过调用map上的lower

std::map
有一个
insert
方法,该方法接受一个“提示”迭代器,如果提示正确,该迭代器将把插入时间从log(n)减少到常量时间。这一点非常明显,因为容器可以确保新添加的项具有小于提示的键,并且具有大于提示之前的项的键。否则,提示是错误的,它将执行正常插入

std::unordered_map
也有类似的
insert
提示功能。如果有的话,提示有什么作用?我不清楚如何使用另一个“提示”迭代器来加速哈希映射插入


如果使用,什么是适当的“提示”。在
std::map
中,通常通过调用map上的
lower_bound
来找到提示。

这是一个接口兼容性问题。基本上,设计考虑了
std::map
的接口

换句话说,对于
std::unordered_map
来说,它没有区别,是否提供了提示

此处评论中的其他信息:


接口兼容性非常重要,因为能够快速/轻松地在
map
unordered\u map
之间切换,提供了无痛转换的宝贵灵活性,因为性能往往是选择一个而不是另一个的决定因素。

提示允许无序map实现执行以下操作:首先比较值以查看提示是否有效。这避免了必须执行比比较操作更昂贵的哈希函数。

我认为提示重载只是为了与普通的
std::map
接口兼容,因为您必须准确地知道要插入值的哈希的位置才能执行任何有用的操作-这意味着您需要考虑加载,桶等,基本上复制了
无序映射
在内部所做的事情。另外,正如您所指出的,insert无论如何都是按O(1)摊销的。所以说清楚一点,您是说它没有任何作用?这就是我所猜测的。这只是为了兼容性。+1是的,接口兼容性对于通用代码非常重要(例如,容器是模板参数:
template
)。能够快速/轻松地在
map
unordered\u map
之间切换非常重要,因为性能往往是选择其中一个的决定因素。@HowardHinnant:正如OP所指出的,提示通常通过调用map::lower\u bound()获得,而unordered\u map没有此方法(因为这对于无序的容器来说毫无意义)。这是否意味着仍然没有提供接口兼容性?@AndyT:接口兼容性有明确的限制。但是
find
equal_range
是其他丰富的迭代器源,可以在这两个API中找到。如果来回切换对您来说是一个重要的目标,那么您将坚持使用通用API子集。委员会已经尽其所能使子集尽可能大,例如允许您在插入无序的_图时提供无用的提示。@HowardHinnant:清晰性不应该比方便性更重要吗?在这种情况下,方便性很小,因为只会给您一个更兼容的界面。我相信困惑的人试图意识到如何使用提示论点所花费的时间比真正需要在地图和无序地图之间切换的人所赢得的时间要多。当然,这是我的主观意见。@AndyT:这总是一个选项。你能举个例子说明这是如何工作的吗?例如,你将如何找到提示并使用它插入到映射中有什么困难?我认为这里的要点是,如果提示指向正确的项……也就是说,键已经在无序的_映射中,那么插入将看到这一点(通过将提示处的值与传入的值进行比较),不需要计算散列。如果密钥不在无序的_映射中,我认为在这种情况下不会有任何改进。