当前位置:  开发笔记 > 编程语言 > 正文

STL矢量vs地图擦除

如何解决《STL矢量vs地图擦除》经验,为你挑选了3个好方法。

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



1> Rob Walker..:

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

Map具有重要的属性,即将新元素插入到映射中不会使指向现有元素的迭代器无效.从地图中删除元素也不会使任何迭代器无效,当然,除了实际指向正在被删除的元素的迭代器之外.

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



2> Daniel James..:

eraseiterator在C++ 11中返回一个.这是由于缺陷报告130:

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

标准委员会接受了这个:

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

(LWG =图书馆工作组).



3> Konrad Rudol..:

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

总而言之,在擦除之后根本就没有廉价的方法来返回"下一个"元素.对于序列,有一种方式.

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

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有