【问题标题】:How to deep copy QMap and other Qt containers如何深拷贝 QMap 和其他 Qt 容器
【发布时间】:2013-05-23 21:44:18
【问题描述】:

一般来说,深拷贝 Qt 容器的正确方法是什么?我不担心递归地深度复制容器,尽管解决这个问题会有所帮助。

【问题讨论】:

  • 上面的代码对我来说很好 - 为什么你认为它不会?
  • @cmannett85 我已经通过 GDB 运行它,发现两个映射都包含“value2”
  • 是的,我一开始看错了代码,这个 sn-p 应该可以正常工作。删除我的答案。
  • 再一次,不适合我——而且我也在使用 Qt 4.8(准确地说是 4.8.4 x64 Linux)。你能发布你用来测试这个的完整代码吗? QMap 是隐式共享的,但是一旦你修改它,COW 机制就会启动并发生深拷贝(当然忽略QString 的隐式共享)。
  • Linux 中的 Qt 5.1 也能正常工作。

标签: c++ qt qt4 deep-copy qmap


【解决方案1】:

尽管每个人都会告诉你——你不深拷贝 Qt 容器——在某些情况下你只需要执行一个实际的深拷贝而不仅仅是一个浅拷贝。为此,请使用detach()

container1 = container2;
container1.detach();

【讨论】:

  • 太棒了。这就是答案
  • 你能举例说明什么时候需要这样做吗?在您修改container1 的那一刻,如果您不修改它,它将执行深层复制 - 为什么要复制它!?
  • @cmannett85 就在昨天,我需要这样做。我有两个线程,一个通过通道(类似于套接字)接收数据,处理数据并将其存储在几个容器中。另一个线程通过定期检查新数据来呈现数据。如果有新数据,它会锁定一个互斥体并从一些容器中复制数据——这就是我需要深度复制的地方。如果我不执行深拷贝,当数据处理线程修改它们时,每个容器都会单独进行锁定,这会降低性能。
猜你喜欢
  • 2016-03-08
  • 2012-04-12
  • 2015-01-13
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多