将 QList 添加到 QList<QList>

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(); 如果我将小列表附加到大列表,则始终为真。 为什么会这样?

P.S。 STL 列表工作得很好。

这是 Qt 容器与类似 stl 的迭代器一起使用时的已知限制。 documentation 对此进行了解释。

Implicit sharing has another consequence on STL-style iterators: you should avoid copying a container while iterators are active on that container. The iterators point to an internal structure, and if you copy a container you should be very careful with your iterators.

恐怕您将不得不找到一种不同的方式来做您正在尝试做的事情(比如使用标准列表或以不同的方式迭代)。

TLDR:如果不更改值,请使用 cbegin()cend()

详情:

  • 编译器调用非 const begin()end() 版本就像你一样 问;如果您调用 cbegin()begin() 它可以使用 const 版本 通过 const ref/pointer.
  • QList 尝试写时复制并在您这样做时共享内存 listBig.append(listSmall);.
  • 在非常量 end() 的下一次迭代中调用 detach()确认本地数据是后复制数据 被多次引用(比如,它被 listBig content 引用 已经)。

总而言之,这是写时复制难以正确实施的一个很好的例子。

BugReport with answer