STL源码剖析------迭代器失效总结

vector:

 为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。你可以从vector里实现capacityreserve成员可以看出这种机制。
    vector
迭代器的几种失效的情况: 
1、当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
2
、当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时firstend操作返回的迭代器都会失效。
3
、当进行删除操作(erasepop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。

deque:
    deque
迭代器的失效情况:C++Primer一书中是这样限定的: 
1、在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 
2
、在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。
3
、在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。

list:

     只有list的迭代器好像很少情况下会失效。也许就只是在删除的时候,指向被删除节点的迭代器会失效吧,其他的还没有发现。
先看两条规制:
1、对于节点式容器(map,list, set)元素的删除,插入操作会导致指向该元素的迭代器失效,其他元素迭代器不受影响。
2
、对于顺序式容器(vector)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效。
众所周之当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作:
代码如下:

[cpp] viewplaincopy

1.  iter = vec.insert(iter);  

2.  iter = vec.erase(iter);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值