关于C ++:STL向量与地图擦除

关于C ++:STL向量与地图擦除

STL vector vs map erase

在STL中,几乎所有容器都具有擦除功能。 我的问题在向量中,擦除功能返回一个迭代器,该迭代器指向向量中的下一个元素。 地图容器不会执行此操作。 而是返回一个空值。 有人知道为什么会有这种不一致吗?


参见http://www.sgi.com/tech/stl/Map.html

Map has the important property that
inserting a new element into a map
does not invalidate iterators that
point to existing elements. Erasing an
element from a map also does not
invalidate any iterators, except, of
course, for iterators that actually
point to the element that is being
erased.

在擦除时返回迭代器的原因是,以便您可以遍历列表擦除元素。如果擦除项目不会使现有的迭代器无效,则无需执行此操作。


erase在C ++ 11中返回一个iterator。这是由于缺陷报告130:

Table 67 (23.1.1) says that container::erase(iterator) returns an iterator. Table 69 (23.1.2) says that in addition to this requirement, associative containers also say that container::erase(iterator) returns void. That's not an addition; it's a change to the requirements, which has the effect of making associative containers fail to meet the requirements for containers.

标准委员会接受了:

the LWG agrees the return type should be iterator, not void. (Alex Stepanov agrees too.)

(LWG =图书馆工作组)。


不一致是由于使用。 vector是对元素具有排序的序列。虽然map中的元素也确实根据某种比较标准进行了排序,但是这种排序在结构中是不明显的。没有一种有效的方法可以使一个要素进入另一个要素(有效=恒定时间)。实际上,遍历地图非常昂贵;迭代器的创建或迭代器本身都涉及遍历整个树。除非使用堆栈,否则无法在O(n)中完成此操作,在这种情况下,所需空间不再恒定。

总而言之,根本没有廉价的方法可以在擦除后返回" next"元素。对于序列,有一种方法。

此外,Rob是对的。 Map无需返回迭代器。


顺便说一句,MS Visual Studio C ++(Dinkumware IIRC)附带的STL提供了带有erase函数的映射实现,该函数将迭代器返回到下一个元素。

他们确实注意到这不符合标准。


我不知道这是否是答案,但是一个原因可能是定位下一个元素的成本。遍历地图本质上是"缓慢的"。


推荐阅读