将QList附加到QList <qlist>

时间:2017-10-19 07:11:12

标签: c++ list qt append 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();如果我将小列表追加到大号,则总是如此。 为什么会这样?

P.S。 STL列表工作正常。

2 个答案:

答案 0 :(得分:3)

当与类似stl的迭代器一起使用时,这是Qt容器的已知限制。 documentation解释了它。

  

隐式共享对STL样式的迭代器有另一个影响:当迭代器在该容器上处于活动状态时,应避免复制容器。迭代器指向内部结构,如果复制容器,则应该非常小心迭代器。

我担心你必须找到一种不同的方式来做你想做的事情(比如使用标准列表或以不同的方式迭代)。

答案 1 :(得分:0)

TLDR:当您不更改值时,请使用cbegin()cend()

详细说明:

  • 编译器会像您一样调用非const begin()end()版本 问;如果您拨打cbegin()begin(),它可以使用const版本 通过const ref / pointer。
  • 当你这样做时,QList会尝试写入时复制并共享内存 listBig.append(listSmall);
  • 在非const end()内的下一次迭代中,有一个调用 detach()在确认本地数据后复制数据 不止一次引用(比如,它被listBig内容引用 的话)。

总而言之,这是为什么难以正确实现copy-on-write的一个很好的例子。

BugReport with answer