我对Qt Qlist容器有一个有趣的问题。 尝试将QList附加到QList使我的迭代器指向未知的内存部分。
QList<int> listSmall;
QList<QList<int>> listBig;
for(int i = 0; i < 3; ++i)
listSmall.append(i);
for(auto it = listSmall.begin(); it != listSmall.end(); ++it)
listBig.append(listSmall);
条件it != listSmall.end();
如果我将小列表追加到大号,则总是如此。
为什么会这样?
P.S。 STL列表工作正常。
答案 0 :(得分:3)
当与类似stl的迭代器一起使用时,这是Qt容器的已知限制。 documentation解释了它。
隐式共享对STL样式的迭代器有另一个影响:当迭代器在该容器上处于活动状态时,应避免复制容器。迭代器指向内部结构,如果复制容器,则应该非常小心迭代器。
我担心你必须找到一种不同的方式来做你想做的事情(比如使用标准列表或以不同的方式迭代)。
答案 1 :(得分:0)
TLDR:当您不更改值时,请使用cbegin()
和cend()
。
详细说明:
begin()
和end()
版本
问;如果您拨打cbegin()
或begin()
,它可以使用const版本
通过const ref / pointer。listBig.append(listSmall);
。end()
内的下一次迭代中,有一个调用
detach()
在确认本地数据后复制数据
不止一次引用(比如,它被listBig内容引用
的话)。总而言之,这是为什么难以正确实现copy-on-write的一个很好的例子。