您的位置:首页 > 编程语言 > C语言/C++

[C++] STL迭代器失效

2015-03-30 15:40 591 查看


参考文章:

STL容器特征总结与迭代器失效 /article/1871759.html

C++迭代器失效问题__map/set等关联容器如何删除元素__vector/list/deque等序列容器如何删除元素__迭代器如何使用 http://blog.163.com/xychenbaihu%40yeah/blog/static/1322296552010824114547940/

1. 连续存储空间(vector,deque,stack)

插入元素:空间满了的时候,就会失效。

删除元素:删除元素可能导致整体移动,会失效。

2. 链接结构(list,map,set)

插入元素:链接结构插入是不会导致失效的。

删除元素:可能导致结构重新构造,比如红黑树,会失效。

关于删除在说一下:一般都会失效,尽量用erase,序列式容器和关联式容器在erase的返回值上有区别:

序列性容器::(vector和list和deque)

erase迭代器不仅使所指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值为下一个有效的迭代器。

所以正确方法为::

for( iter = c.begin(); iter != c.end(); )

iter = c.erase(iter);

关联性容器::(map和set比较常用)

erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以要采用erase(iter++)的方式删除迭代器,

所以正确方法为::

for( iter = c.begin(); iter != c.end(); )

c.erase(iter++);

Tips:

其实对于list两种方式都可以正常工
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: