STL矢量vs地图擦除

时间:2008-09-09 19:37:44

标签: c++ stl

在STL中,几乎所有容器都具有擦除功能。我的问题是在向量中,erase函数返回一个指向向量中下一个元素的迭代器。地图容器不会这样做。相反,它返回一个空白。任何人都知道为什么会出现这种不一致的情况?

5 个答案:

答案 0 :(得分:26)

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

  

地图具有重要的属性   将新元素插入地图   不会使迭代器失效   指向现有元素。擦除   地图中的元素也没有   使任何迭代器无效,除了   当然,对于实际的迭代器   指向正在存在的元素   擦除。

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

答案 1 :(得分:12)

erase在C ++ 11中返回iterator。这是由于defect report 130

  

表67(23.1.1)表示container :: erase(iterator)返回一个迭代器。表69(23.1.2)表示除了这个要求之外,关联容器还说容器:: erase(iterator)返回void。这不是一个补充;它是对需求的一种改变,其结果是使关联容器无法满足容器的要求。

标准委员会接受了这一点:

  

LWG同意返回类型应该是迭代器,而不是无效。 (Alex Stepanov也同意。)

(LWG =图书馆工作组)。

答案 2 :(得分:5)

不一致是由于使用。 vector是一个对元素进行排序的序列。虽然map中的元素也是按照某种比较标准排序的,但这种排序在结构上是不明显的。没有有效的方法可以从一个元素到另一个元素(有效=恒定时间)。事实上,迭代地图是相当昂贵的;迭代器的创建或迭代器本身涉及遍历整个树。这不能在 O n )中完成,除非使用堆栈,在这种情况下所需的空间不再是常量。

总而言之,擦除后没有廉价的方法可以返回“下一个”元素。对于序列,的一种方式。

另外,罗布是对的。 Map不需要返回迭代器。

答案 3 :(得分:3)

另外,MS Visual Studio C ++(Dinkumware IIRC)附带的STL提供了一个带有erase函数的map实现,它将迭代器返回到下一个元素。

他们注意到它不符合标准。

答案 4 :(得分:1)

我不知道这是否是答案,但一个原因可能是定位下一个元素的成本。迭代地图本身就是“慢”。