[英]Appending QList to QList<QList>
我对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();
如果我将小名单附加到大名单上总是如此。 为什么会这样?
PS STL列表工作正常。
当与类似stl的迭代器一起使用时,这是Qt容器的已知限制。 文档解释了它。
隐式共享对STL样式的迭代器有另一个影响:当迭代器在该容器上处于活动状态时,应避免复制容器。 迭代器指向内部结构,如果复制容器,则应该非常小心迭代器。
我担心你必须找到一种不同的方式来做你想做的事情(比如使用标准列表或以不同的方式迭代)。
TLDR:使用cbegin()
和cend()
时,你不改变的值。
细节:
begin()
和end()
版本; 如果通过const ref / pointer调用cbegin()
或begin()
它可以使用const版本。 listBig.append(listSmall);
时,QList会尝试写入时复制并共享内存listBig.append(listSmall);
。 end()
内的下一次迭代中,调用detach()
,在确认本地数据被多次引用之后复制数据(例如,它已被listBig内容引用)。 总而言之,这是为什么难以正确实现copy-on-write的一个很好的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.