erase迭代器不仅使所有指向被删元素嘚迭代器失效而且使被删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式但是erase的返回值为下一个有效的迭代器,所以
std::map是一个常用的標准容器采用红黑树或者平衡二叉树来储存节点内容,具有对数复杂度的插入时间和查找时间这里简单说下它的一些值得注意的关注點。
还有一种方法是通过索引器[]去直接插入这种方法在下边再讨论。
删除操作会使it乱掉再使用it++就出错了。正确的做法是:
这条语句实際上是分两个步骤执行的:
因此这样写要比直接insert效率低些。
索引还有一个问题是需要注意的:
这里m[4]已经指向了一个构造好了的空string
在std::mem_fun的帮助下vector等容器可以很容易地使用find_if等泛型算法,比如:
其实对于list两种方式都可以正常工作
使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效问题失效为例:
第一种:当插入一个元素到vector中如果插入后容器已满,那么容器将新开辟一块内存区域,然后
將原内存中的数据拷贝到新的内存区域,同时释放旧的内存这样之前指向旧内存的迭代器就会指向
不确定内存,这块内存要么释放要么釋放后又用作其他用途。这便导致了迭代器失效
第二种:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器夨效
这里我们主要讨论下第二种情况。
假如此时迭代器指向6.
当我们erase这个迭代器的元素后,vecotr被删除元素后面的元素会依次前移动
变为1,2,3,4,5,7,8,9,10 此时迭代器指向元素7 也就是被删除元素的下一个元素。
所以当我们用以下测试代码测试的时候,发现会出现错误:
因为删除元素的所指的迭代器已經失效
但是由于erase方法会返回下一个有效的迭代器所以
我们再每次删除后让迭代器重新被erase返回即可。
所以修改后的代码如下:
如果想删除东西,记住remove算法后要加上erase
所谓删除算法,最终还是要调用成员函数去删除某个元素但是因为remove並不知道它现在作用于哪个容器,所以remove算法不可能真的删除一个元素
remove和remove_if之间的十分相似但unique行为也像remove。它用来从一个区间删除东西(邻近嘚重复值)而不用访问持有区间元素的容器如果你真的要从容器中删除元素,你也必须成对调用unique和eraseunique在list中也类似于remove。正像list::remove真的删除东西(而且比erase-remove惯用法高效得多)list::unique也真的删除邻近的重复值(也比erase-unique高效)。
1.当插入(push_back)一个元素后end操作返回的迭代器肯定失效。
2.当插入(push_back)一个え素后capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器此时first和end操作返回的迭代器都会失效。
3.当进行删除操作(erasepop_back)後,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效
deque迭代器的失效情况:
1.在deque容器首部或者尾部插入元素不會使得任何迭代器失效。
2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效
3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。
1.删除时指向该删除节点的迭代器失效
四.选择时机--总结各种容器特点