读书人

vector容器的迭代器失效有关问题

发布时间: 2013-08-04 18:26:16 作者: rapoo

vector容器的迭代器失效问题
#include<iostream>
#include<vector>
#include<list>

int main()
{
std::vector<int> list_;
int number;
while(std::cin >> number)
{
list_.push_back(number);
}
std::cin.clear();
std::vector<int>::iterator first = list_.begin(),
last = list_.end();
while(std::cin >> number)
{
list_.insert(first,number);
}
for(std::vector<int>::iterator dex = list_.begin(); dex != list_.end(); ++ dex)
{
std::cout <<*dex << " ";
}
return 0;
}

请问一下这个里面的迭代器为什么会失效?他不是一直指的是数组中的一个固定的地址吗??那为什么在同一个地方进行数据的插入会出现debug??而list却是可以实现的.难道每插入一个元素的时候他的首地址改变导致后面的地址会改变??可是在容器中加入数据也不行,不明白怎么才叫迭代器失效?
[解决办法]
vector::insert 会导致迭代器失效,因此 first 和 last 在 while 以后已经不能用了。
[解决办法]
你要知道vector相当于一个动态可增长的数组,如果当前的长度不能满足需求,vector内部会重新分配新的内存,并将旧的内存数据拷贝到新分配的内存上,最后再释放掉旧内存。
可以参考下面这个例子。断言会失败。

    vector<int> v;
v.reserve(10);
v.push_back(1);

vector<int>::iterator it = v.begin();
int* p = it.operator ->();

v.reserve(100);
it = v.begin();
int* q = it.operator ->();

assert(p==q);

[解决办法]
所以如果vector进行insert操作,可能会导致内存重新。原先的迭代器指向的旧内存可能被释放掉了。相当于迭代器就失效了,因此不要在继续使用了。
[解决办法]
关于stl的任何疑问,参考《c++标准程序库》《stl源码剖析》。侯捷译。
[解决办法]
c++已经规定这种迭代器会失效了。就不要使用这种行为了。为啥非要行一次呢?
------解决方案--------------------


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

很少的时候最好也不要这么用,因为无法确定是否移动了,完全由编译器实现;
[解决办法]
引用:
好的,谢谢,明白了!以后会注意的!
你能不能好好学学基础知识再写程序呢,同学
[解决办法]
如果在使用前先给vector申请好足够大小的内存,是可以保证不发生内存移动的
如果你知道最大容量是多少,就在vector建好后调一下reserve申请一下内存吧

标准里是说发生内存重分配才会导致迭代器失效,对内存足够的情况是能保证迭代器的有效性的

上面各位说的都太片面了

读书人网 >C++

热点推荐