首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QList附加到QList<QList>

将QList附加到QList<QList>
EN

Stack Overflow用户
提问于 2017-10-19 07:11:12
回答 2查看 1.9K关注 0票数 2

Qlist容器有一个有趣的问题。试图将QList附加到QList使我的迭代器指向内存中未知的部分。

代码语言:javascript
复制
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列表工作得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-19 12:14:07

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

隐式共享在STL风格的迭代器上还有另一个后果:当迭代器在容器上活动时,您应该避免复制容器。迭代器指向内部结构,如果您复制容器,您应该非常小心您的迭代器。

恐怕您必须找到一种不同的方法来完成您想要做的事情(比如使用标准列表或以不同的方式迭代)。

票数 3
EN

Stack Overflow用户

发布于 2017-10-20 06:04:56

TLDR:在不更改值时使用cbegin()cend()

详细信息:

  • 编译器按照您的要求调用非const begin()end()版本;如果通过const /指针调用cbegin()begin(),则可以使用const版本。
  • QList尝试在执行listBig.append(listSmall);时复制写入并共享内存。
  • 在非const end()中的下一次迭代中,调用detach(),它在确认本地数据不止一次引用后复制数据(比如,listBig内容已经引用了它)。

总之,这是一个很好的例子,说明为什么写拷贝很难正确实现.

有答案的BugReport

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46824426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档