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列表工作得很好。
发布于 2017-10-19 12:14:07
当与类stl迭代器一起使用时,这是Qt容器的已知限制。文档解释了这一点。
隐式共享在STL风格的迭代器上还有另一个后果:当迭代器在容器上活动时,您应该避免复制容器。迭代器指向内部结构,如果您复制容器,您应该非常小心您的迭代器。
恐怕您必须找到一种不同的方法来完成您想要做的事情(比如使用标准列表或以不同的方式迭代)。
发布于 2017-10-20 06:04:56
TLDR:在不更改值时使用cbegin()和cend()。
详细信息:
begin()和end()版本;如果通过const /指针调用cbegin()或begin(),则可以使用const版本。listBig.append(listSmall);时复制写入并共享内存。end()中的下一次迭代中,调用detach(),它在确认本地数据不止一次引用后复制数据(比如,listBig内容已经引用了它)。总之,这是一个很好的例子,说明为什么写拷贝很难正确实现.
https://stackoverflow.com/questions/46824426
复制相似问题