在使用QT迭代器的时候,发现迭代器的终止行为与预期不符,代码如下
int main(int argc, char* argv[]) {
QList<int> ranges = {2, 3, 4, 5};
QList<int> temp = ranges;
auto it1 = temp.cbegin();
auto it = temp.begin();
int count = 0;
while ((it1 + 1) != temp.cend() && count < 20) {
++it1;
++count;
}
qDebug() << "count" << count;
return 0;
}
运行结果是20,也就是it1+1判断cend()不对,迭代器失效
原因分析:原因在于QList<int> temp = ranges,拷贝ranges到temp上,QT底层是将ranges的地址赋值给temp,此时调用temp.cbegin()获取的是ranges的const 迭代器it1,然后调用temp.begin(),底层会调用(detach->d.detach->reallocateAndGrow),将内存块拷贝到新的地址,将temp指向新地址,此时it1迭代器会失效,和temp.cend()无法再进行判断。
将temp.begin()代码去掉或者在获取cbegin()之前调用resize(任意行为都可以,只要能触发拷贝)触发拷贝,或者begin()之后重新获取cbegin()迭代器等方式都可以解决这个问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。