C++ “a”是什么;提示;?

C++ “a”是什么;提示;?,c++,c++11,C++,C++11,关于: 模板 迭代器位置提示(常量迭代器提示,Args&…Args); 在容器中插入新元素,使用hint作为元素应该放在哪里的建议 那么,如果这是一个建议,这是否意味着实现不必将元素放在那里?什么是提示?通常,插入到基于树的映射(如std::map)中需要进行O(logn)查找以找到正确的插入点。如果正确的插入点与提供的提示相邻,则可以保存O(logn)查找,而操作为O(1) 通常情况下,当给定键的现有项不存在时,插入一个项。然后,您可以使用.lower\u-bound()查找现有键(如果找不

关于:

模板
迭代器位置提示(常量迭代器提示,Args&…Args);
在容器中插入新元素,使用
hint
作为元素应该放在哪里的建议


那么,如果这是一个建议,这是否意味着实现不必将元素放在那里?什么是提示?

通常,插入到基于树的映射(如
std::map
)中需要进行O(logn)查找以找到正确的插入点。如果正确的插入点与提供的提示相邻,则可以保存O(logn)查找,而操作为O(1)


通常情况下,当给定键的现有项不存在时,插入一个项。然后,您可以使用
.lower\u-bound()
查找现有键(如果找不到键,则返回插入点的迭代器),而不是使用
.find()
(如果未找到该键,则返回该插入点的迭代器)。然后,如果键不存在,则使用该迭代器进行暗示插入。

std::map
是一个关联容器,它保持其键值对相对于键排序。由于与查找相关的成本,插入具有O(logN)复杂性。但是通过提供一个提示,迭代器在哪里开始搜索-插入可以在摊销的常数时间而不是对数时间内发生。

不准确。但是,在C++11之前的某一点上,草案明确授予实现忽略提示的权限,这是可以原谅的:

见表102:

。。。允许实现忽略提示

幸运的是,在C++11和forward reads中,这一点得到了纠正:

。。。将该元件尽可能靠近
p
之前的位置插入

通常为对数,但如果元素正好插入
p

所以“提示”现在已经有牙了。它应该得到尊重。请注意,这些注释仅适用于关联容器(映射、多重映射、集、多重集)

在C++98/03中,“提示”不正确地用于
insert
。但这一点被更正了,并且随后在
emplace\u hint
中采用了这一措辞

仍然允许实现忽略无序容器的提示。这是有充分理由的。没有好的实现策略来利用对无序容器的提示。这里的提示只是为了在容器泛型代码中提供与关联容器的兼容性

更新 多年来,某个地方更新了其文档,现在是正确的:

在容器中尽可能靠近提示前的位置插入新元素


没关系,我知道的每一个实现都会100%忽略它@MooingDuck我知道libstdc++会检查前面的位置,如果可以,它会使用它。否则它只执行常规插入。@MooingDuck:libc++执行与libstdc++相同的操作。哦,也许我在考虑
allocate
。假设您不想在映射中插入已排序元素的列表。您可以使用前面插入的元素的位置来提示下一个元素将位于哪个容器中,而不是从根目录中再次搜索。您可以解释如何在摊销O(1)时间内完成此操作(如参考文献中所示)?它是否需要检查提示是否是正确的插入点,这样的检查将花费O(lgn)?@JasonL否,记住这些迭代器是双向的。因此,您只需检查迭代器的上一个位置,并查看它是否适合(关于键顺序)插入条目。如果提示不正确,那么返回到O(logn)未插入的插入。我不理解通常的情况<代码>std::map::emplace仅在密钥不存在时插入。无需调用
find()
lower\u-bound()