假设我有某种集合,并且我在它的开头获得了一个迭代器。现在假设我修改了该集合。无论集合或迭代器的类型如何,我仍然可以安全地使用迭代器吗?
为了避免混淆,以下是我讨论的操作顺序:
- 获取集合的迭代器。
- 修改集合(显然
不是其中的元素,而是集合本身)。
- 使用步骤1中获得的迭代器。根据STL标准它仍然有效吗?!
取决于容器。例如如果它是一个vector
,修改容器后所有迭代器都可以失效。然而,如果它是一个list
,与修改位置无关的迭代器仍然有效。
-
当向量的内存被重新分配时,向量的迭代器就会失效。此外,在向量中间插入或删除元素会使指向插入或删除点之后的元素的所有迭代器无效。因此,如果您使用,则可以防止向量的迭代器失效reserve()
预分配向量将使用的尽可能多的内存,并且所有插入和删除都在向量的末尾。[1] http://www.sgi.com/tech/stl/Vector.html#5
-
迭代器失效的语义deque
如下。Insert
(包括push_front
and push_back
) 使所有引用 a 的迭代器无效deque
. Erase
在一个中间deque
使所有引用的迭代器无效deque
. Erase
在一个的开始或结束deque
(包括pop_front
and pop_back
) 仅当迭代器指向已删除的元素时才使迭代器无效。[2] http://www.sgi.com/tech/stl/Deque.html#3
-
List
s 具有一个重要的属性,即插入和拼接不会使列表元素的迭代器无效,并且即使删除也只会使指向被删除元素的迭代器无效。[3] http://www.sgi.com/tech/stl/List.html
-
Map
具有一个重要的属性,即向 a 中插入一个新元素map
不会使指向现有元素的迭代器无效。从映射中删除元素也不会使任何迭代器无效,当然,实际指向正在删除的元素的迭代器除外。[4] http://www.sgi.com/tech/stl/Map.html(同样适用于set
, multiset
and multimap
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)