迭代器失效问题

19 篇文章 0 订阅

找出下面迭代器错误的使用方式:

int main(){

      vector<int> v1,v2;

      set<int> s1,s2;

      for(int i=0;i<10;i++){

            v1.push_back(i);

            v2.push_back(i);

            s1.insert(i);

            s2.insert(i);

      }

//A

vector<int>::iterator it1=v1.begin();

while(it1!=v1.end()){

      v1.erase(it1++):

}

//B

vector<int>::iterator it2=v2.begin();

while(it2!=v2.end()){

      it2=v2.erase(it2);

}

//C

set<int>::iterator it3=s1.begin();

while(it3!=s1.end()){

      s1.erase(it3++);

}

//D

set<int>::iterator it4=s2.begin();

while(it4!=s2.end()){

      it4=s2.erase(it4);}

}

  • 对容器进行删除操作时,容器中元素的数量发生变化,这种变化可能会导致某些元素的物理地址发生改变,使指向这些元素的迭代器失效,但是并非所有容器的添加删除操作都会导致迭代器失效。
  • vector的删除操作都会导致迭代器失效。向vector中插入元素时,end迭代器一定失效,因为最后一个元素已经发生变化。如果插入时vector中原空间已满,vector会重新申请空间并将所有元素拷贝到新空间,由于vector中所有元素都移动了位置,因此会导致所有迭代器失效,包括first迭代器和end迭代器。
  • 从vector中删除元素时会导致被删除元素及其后面所有的迭代器失效,包括end迭代器,而被删除元素之前的迭代器不受影响,包括first迭代器。删除元素操作会使被删除元素之后所有元素向前移动,end迭代器也会随之前移,因此原来指向这些元素的迭代器都会失效。
  • list的操作不会导致任何迭代器失效,删除操作只会导致被删除元素的迭代器失效。由于list容器的底层是链表,相连表中删除元素不会影响其他结点的物理位置,因此只想其他元素的迭代器不会失效,包括first迭代器和end迭代器。
  • deque的删除操作都会导致迭代器失效。在deque的首部删除元素会导致first迭代器失效;在deque的尾部删除元素会导致end迭代器失效;在deque的任意位置删除元素可能导致部分迭代器失效,可能包括first迭代器和end迭代器。
  • 在deque的首部删除元素只会影响第一段数据空间的第一个有效元素;在deque的尾部删除元素只会影响最后一段数据空间的最有一个有效元素;在deque的任意位置删除元素会导致多段数据空间的元素整体发生移动。
  • set和map的操作不会导致迭代器失效,删除操作只会导致被删除元素的迭代器失效。由于set和map容器的底层使红黑树,向红黑树中删除元素不会影响其他结点的物理位置,因此指向其他元素的迭代器不会失效,包括forst迭代器和end迭代器。
  • 综上,A错误,BCD正确。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值