2 mushanps mushanps 于 2014.06.15 16:32 提问

关于vector的insert 、 erase、resize操作导致迭代器无效化

typedef vectorint_vec;
int_vec v(2,0);
int_vec::iterator iter_b = v.begin();
v.insert(v.begin(),1);
cout<<*iter_b<<endl;
//这种操作会导致iter_b无效,输出随机值
但是:
int_vec v1(2,0);
int_vec::iterator iter_b = v.begin();
v.erase(v.begin());
cout<<*iter_b<<endl;
//却能正常输出当前vector内的第一个元素,求解释
同时:
如果insert和erase依次进行操作,事先初始化的迭代器也不会被无效化,求解释

1个回答

u012458164
u012458164   2014.11.18 21:46

vector容器是先用allocator分配定量的内存,当vector插入某个数量的元素后超出了vector的容量,此时会重新用allocator申请更大容量的内存,将原来的元素拷贝到新的内存空间中,原来的内存空间就会被释放,那么原先定义的迭代器就失效了; 希望这点解释能帮助到你。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++关于迭代器删除(erase)插入(insert)失效问题
初学者的我在学习迭代器的时候(今天这里主要说的是vector的迭代器)碰到了一些问题,纠结了好些时候,总算弄明白了一点。 迭代器会在删除插入等操作后失效,即在其删除插入位置后的迭代器会失效,那所谓的失效是什么意思? 失效一般是指迭代器指向了和你预期不一样的位置了,但这个时候,你可以通过自增自减使它指向正确位置,但是,注意,有些时候,你是不能这样做的,迭代器会完全失效,必须重新初始化。
迭代器失效的几种情况总结
1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。 for (iter = cont.begin(
vector执行insert或erase后迭代器应该重新获取
书上看到: vector执行insert或erase后迭代器应该重新获取, 这是为什么呢? 因为执行insert以后可能内存重新分配了,原先的迭代器自然也就失效了。 代码片段: vector array; array.reserve(5); //修改容量为5, 若容量小于5,则该段程序将崩溃 cout<<array.capacity()<<endl; int ii=0;
STL中vector的删除操作引起迭代器失效和空间重新配置
学习STL时vector是最先学习也是用的最多的一类容器,它的通过动态管理内存从而实现数组长度的自增长为我们的使用带来了很大方便,然而它的这一特性也带来了一些陷阱:所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一
vector迭代器失效解决方法 及 内存原理
迭代器失效 vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存。这个动作将导致先前获取的迭代器,,第一层和第二层均失效。造成失效的两个函数:
Erase导致的迭代器失效分析(C++11)
循环中的erase: (1)对于关联式容器,erase之后什么也不返回,则后续的迭代器无法向下,即不能在执行++it或it--操作。需要做的是在删除时,进行it++,让迭代器走下去就OK。 (2)对于序列式容器,erase之后返回的是下一个迭代器,但会导致后续的迭代器全部失效,此时如果想要循环继续,要保存迭代器的返回值,从此处开始迭代。 无论哪种容器,常规的三段式for( )都不再适用。
没有躲过的坑--vector使用erase后迭代器变成野指针
vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。erase–return value 首先需要明确一下vector的两种erase:C++98中是这样的:iterator erase (iterator position); iterator erase (iterator first, iterator last)C++11是这样的:iterat
对vector/string执行insert/erase操作后迭代器的情况说明
对vector/string执行insert/erase操作后迭代器的情况说明
关于STL中map的erase迭代器是否失效的讨论
近来,在阅读一份开源代码的时候,看到了类似如下的代码:typedef std::map id_names_t; id_names_t id_names; void EraseName(std::string name) { id_names_t::iterator it = id_names.begin(); while(it != id_names.end()) { if(it->s
C++ vector 迭代器失效原因
众所周知,vector在内存中是顺序存储的,那么当vector的长度增加时,也就是往里面继续pushback新的数据,当前块的内存不够,vector不得不重新申请一块新的更大的内存,然后把之前的数据复制过来,再插入新的数据。 为了验证这个可以看看下面的测试代码:#include<iostream> #include<vector> using namespace std;int main() {