vector容器的迭代器失效问题

来源:互联网  时间:2016/8/29 15:30:59

关于网友提出的“ vector容器的迭代器失效问题”问题疑问,本网通过在网上对“ vector容器的迭代器失效问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: vector容器的迭代器失效问题
描述:

#include
#include
#include
int main()
{
std::vector   list_;
int number;
    while(std::cin >> number)
{
list_.push_back(number);
}
std::cin.clear();
std::vector::iterator    first = list_.begin(),
                        last  = list_.end();
while(std::cin >> number)
{
list_.insert(first,number);
}
for(std::vector::iterator dex = list_.begin(); dex != list_.end(); ++ dex)
{
std::cout <<*dex << " ";
}
return 0;
}
请问一下这个里面的迭代器为什么会失效?他不是一直指的是数组中的一个固定的地址吗??那为什么在同一个地方进行数据的插入会出现debug??而list却是可以实现的.难道每插入一个元素的时候他的首地址改变导致后面的地址会改变??可是在容器中加入数据也不行,不明白怎么才叫迭代器失效?


解决方案1:

引用 9 楼 u010222864 的回复:
好的,谢谢,明白了!以后会注意的!
你能不能好好学学基础知识再写程序呢,同学 解决方案2:

   c++已经规定这种迭代器会失效了。就不要使用这种行为了。为啥非要行一次呢?

解决方案3:

    关于stl的任何疑问,参考《c++标准程序库》《stl源码剖析》。侯捷译。

解决方案4:

    所以如果vector进行insert操作,可能会导致内存重新。原先的迭代器指向的旧内存可能被释放掉了。相当于迭代器就失效了,因此不要在继续使用了。

解决方案5:

   你要知道vector相当于一个动态可增长的数组,如果当前的长度不能满足需求,vector内部会重新分配新的内存,并将旧的内存数据拷贝到新分配的内存上,最后再释放掉旧内存。
    可以参考下面这个例子。断言会失败。

    	vector v;
v.reserve(10);
v.push_back(1);
vector::iterator it = v.begin();
int* p = it.operator ->();
v.reserve(100);
it = v.begin();
int* q = it.operator ->(); 
assert(p==q);
解决方案6:

如果在使用前先给vector申请好足够大小的内存,是可以保证不发生内存移动的
如果你知道最大容量是多少,就在vector建好后调一下reserve申请一下内存吧
标准里是说发生内存重分配才会导致迭代器失效,对内存足够的情况是能保证迭代器的有效性的
上面各位说的都太片面了

解决方案7:

引用 5 楼 u010222864 的回复:
请问一下,那数据很少的时候一次也不行呢?难道每次都进行重新分配的问题??

很少的时候最好也不要这么用,因为无法确定是否移动了,完全由编译器实现; 解决方案8:

vector::insert 会导致迭代器失效,因此 first 和 last 在 while 以后已经不能用了。

上一篇c++一个算出字符串的问题
下一篇wchar_t char string转换
明星图片
相关文章
《 vector容器的迭代器失效问题》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)