[英]STL vector vs map erase
在STL中,几乎所有容器都具有擦除功能。 我的问题是在向量中,erase函数返回一个指向向量中下一个元素的迭代器。 地图容器不会这样做。 相反,它返回一个空白。 有人知道为什么会有这种不一致吗?
见http://www.sgi.com/tech/stl/Map.html
Map具有重要的属性,即将新元素插入到映射中不会使指向现有元素的迭代器无效。 从地图中删除元素也不会使任何迭代器无效,当然,除了实际指向正在被删除的元素的迭代器之外。
在擦除时返回迭代器的原因是,您可以随时遍历列表擦除元素。 如果擦除项目不会使现有迭代器无效,则无需执行此操作。
erase
在C ++ 11中返回一个iterator
。 这是由于缺陷报告130 :
表67(23.1.1)表示container :: erase(iterator)返回一个迭代器。 表69(23.1.2)表示除了这个要求之外,关联容器还说容器:: erase(iterator)返回void。 这不是一个补充; 它是对需求的更改,其结果是使关联容器无法满足容器的要求。
标准委员会接受了这个:
LWG同意返回类型应该是迭代器,而不是无效。 (Alex Stepanov也同意。)
(LWG =图书馆工作组)。
不一致是由于使用。 vector
是对元素具有排序的序列。 虽然map
中的元素也是按照某种比较标准排序的,但这种排序在结构上是不明显的。 没有有效的方法可以从一个元素到另一个元素(有效=恒定时间)。 事实上,迭代地图是相当昂贵的; 迭代器的创建或迭代器本身涉及遍历整个树。 这不能在O ( n )中完成,除非使用堆栈,在这种情况下所需的空间不再是恒定的。
总而言之,在擦除之后根本就没有廉价的方法来返回“下一个”元素。 对于序列, 有一种方法。
另外,罗布是对的。 Map不需要返回迭代器。
另外,MS Visual Studio C ++(Dinkumware IIRC)附带的STL提供了一个带有erase
函数的map实现,它将迭代器返回到下一个元素。
他们确实注意到它不符合标准。
我不知道这是否是答案,但一个原因可能是定位下一个元素的成本。 迭代地图本身就是“慢”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.