请教大家一个问题 在对容器元素进行添加和删除时,iterator会部分或全部的失效。下面一个例子
vector<int>::iterator first=v.begin(),last=v.end();
while(first!=last){
//do some processing
//insert new value and reassign first,which otherwise would be invalid
first=v.insert(first,42);
++first;
}
上述代码的行为未定义,原因是循环体中实现了元素的添加运算,添加元素使得存储在last中的迭代器失效。该迭代器既没有指向容器的v元素,也不再指向v的超出末端的下一个位置。
问题1:为什么“该迭代器既没有指向容器的v元素,也不再指向v的超出末端的下一个位置”。迭代器不是一个指针吗?虽然删除了他指向的元素,但在他所指向的地址又添加了其他元素,为什么会不指向容器中的元素呢?
问题2:对于vector类型的容器,当在其中(非末端下一个位置)插入元素时,是不是插入点以后的所有元素都向后移动?
你可以把迭代器理解为,用对象封装的指针(实际上并不是一定这样,但是你可以这么去理解)。
迭代器失效是因为,某一些容器在进行一些操作的时候,会因为各种原因(比如之前分配的内存不够啊等等)申请新的内存地址,并把数据转移过去,老的内存有可能会被释放。
迭代器就好比门牌号一样,你现在在一栋楼里,挨个门访问。
突然,楼里面的居民全部搬家了,这时候你还去访问以前的那个门牌号,那肯定你是找不到人的。
这个时候,你需要想办法拿到新的地址,这样你可以接着访问。
调用任何vector的non const函数都有可能使之前获得的迭代器失效。例如push back,insert,erase等等。
至于在容量足够的情况下,添加元素必然会使从添加位置起的所有迭代器失效(因为数据被移动了)。
要处理这种情况也很简单,就是在每一次有可能使迭代器失效的操作进行之后,重新取迭代器。
也就是,在insert后面加一行 last = v。end()
while (first != last) {如果添加一个元素时内存够用,不需要重新分配 ,将元素向后移 迭代器原先所指向的地址不是又添加了其他元素
这时迭代器为什么也会失效呢
当不需要重新分配时,迭代器原先所指向的地址确实变成了其他元素,这个我已经验证过了。说它失效是因为我们不知道什么时候vector会重新申请内存,我们不能做没有把握的事。即使vector没有重新分配内存,迭代器所指向的内容也不是我们所需要的了,对它做操作没有意义。你也不要纠结于“失效”这两个字,当迭代器的行为不可预知时,我们就认为它是失效的。
本回答被提问者和网友采纳