将 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 引用
已经)。
总而言之,这是写时复制难以正确实施的一个很好的例子。
我对 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 引用 已经)。
总而言之,这是写时复制难以正确实施的一个很好的例子。