问题标签 [deep-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
559 浏览

c++ - C++:在深拷贝中更新指针(有效)

我的问题最好用一个代码示例来说明,所以让我们开始吧:

现在我想做的是制作这个 Game 类的深拷贝。我创建了一个新向量,其中包含新的 shared_ptrs,它指向新的 Card 对象,它们是原始 Card 对象的副本。那部分很容易。

然后麻烦开始了,m_ptrs 的指针应该更新为指向 m_cards 中的卡片,这不是简单的任务。

我能想到的唯一方法是创建一个映射并在复制 m_cards(带有map[oldPtr] = newPtr)期间填充它,然后使用它来更新 m_ptrs。但是,这只是O(m * log(n))m = m_ptrs.size(); n = m_cards.size())。因为这将是一个非常常规的操作*我想有效地做到这一点,我觉得O(m)使用自定义指针应该是可能的。但是,我似乎无法找到一种有效的方法来做到这一点。有谁会吗?

*它用于为人工智能创建一个测试平台,让它“尝试”不同的动作


编辑:我想补充一点关于接受答案,因为我还没有。我一直在等我回到这个项目(因为我在这个项目上工作了太多,所以我走上了旁道——如果你这样做是为了好玩,那就必须保持乐趣),所以在我接受之前可能需要一段时间答案。不过,我会在一段时间内接受答案,所以不要担心:P


编辑 nr 2:我还没有回到这个项目。现在,我正在考虑只是采取O(m * log(n))方式而不是抱怨,然后看看是否需要更快。然而,由于我最近花了一些时间来学习我的模式,我也认为我真的需要一些时间来重构这个项目。哦,我可能会花一些时间利用我掌握的所有新知识来解决这个问题。由于没有答案说“只需坚持使用哈希图,稍后再看看它是否真的需要更快”(如果有的话,我实际上会非常失望,因为这不是我问题的答案),我是推迟选择答案,直到我回到这个项目。


编辑 nr 3:我仍然没有回到这个项目。更准确地说,它已被无限期搁置。我很确定我现在不会让我的头太低O(m * log(n)),然后如果结果证明是个问题,也许以后再看看。但是,这并不是我的问题的好答案,因为我明确要求更好的性能。不想让答案不再被接受,我选择了最有帮助的答案并接受了它。

0 投票
1 回答
537 浏览

c# - C# 使用 BinaryFormatter 深度复制树结构

编辑 1

肯特减轻了我的恐惧。但是,我发现该规则有一个例外。我为 Node 类编写了一个方法,该方法将向上遍历层次结构,直到到达根节点并返回其哈希码。除了一个对象之外,哈希码一直是相同的。总之,愤怒。


我正在编写我的第一个(相对)大型 C# 应用程序。但是,我想我发现了一个我搞砸的主要错误。

我的应用程序解析 XML 文件并创建对象层次结构,每个对象都继承自 Node 类,具有子列表和节点父引用。

我需要能够复制这个结构。概念是初始结构保存默认数据,您可以获取自己的副本并在使用时对其进行修改。所以我使用了一个通用的DeepClone< T >扩展方法来使用BinaryFormatter

我的问题,虽然我觉得我已经知道(并且害怕)答案是什么,但这是否会给我留下重新分配所有父节点和子节点的引用的问题?


免责声明:当我完成这篇文章时,我意识到我犯的所有设计错误以及如何避免它们,包括这个。在我的辩护中,这个学期的大学将是我第一次参加数据结构课程。;) 我完全希望树的某些重要部分我未能实现,这将有助于解决这个问题。>_<

0 投票
9 回答
9490 浏览

c# - 在 C# 中创建深拷贝

我想制作一个对象的深层副本,这样我就可以更改新副本,并且仍然可以选择取消我的更改并取回原始对象。

我的问题是该对象可以是任何类型,即使来自未知程序集。我不能使用BinaryFormatteror XmlSerializer,因为该对象不必要地具有 [Serializable] 属性。

我尝试使用以下Object.MemberwiseClone()方法来做到这一点:

问题在于它不适用于可枚举(数组,列表等),不适用于字典。

那么,如何在 C# 中制作未知对象的深层副本?

TNX很多!

0 投票
1 回答
769 浏览

python - 深度复制(ing)从列表继承并覆盖附加的 TypedList 类的问题

我不明白为什么TypeList类的新实例没有my_type属性。

这是我的代码:

执行它会返回以下输出:

0 投票
1 回答
907 浏览

python - 派生的python对象的深拷贝

我在 python 中有一个对象,它派生自QtGui.QGraphicsPixmapItem一些基本属性和方法。在调用deepcopy对该对象的引用后,我收到一条错误消息,指出underlying C/C++ object has been deleted当我尝试使用副本时。我之前收到过这个错误,它发生在我没有调用基类的构造函数时,__init__所以我认为这个错误是因为QtGui.QGraphicsPixmapItem没有被复制。

我该如何指定这个?我所知道的是有一种__deepcopy__方法可以达到这个目的。

0 投票
6 回答
231 浏览

c++ - 如果不在纯虚拟基类中创建显式函数,就不能完成复制构造吗?

我的目标是做一个类的深拷贝,但是一个虚拟类却造成了麻烦。

编译错误信息:

我计划拥有更多从 Vir 继承的 Handler 类(如 Handler1、Handler2 等),并将拥有自己独特的成员(如 float a; 或 double b; 等)。因此,将所有 Handler 类的所有 getter 和 setter 函数保留在 Vir 类中对我来说是没有意义的。我想在 Handler 类中保留我的 getter 和 setter 方法,因为这些成员对于 Handler 类是唯一的。编译器不允许我这样做。帮助?

0 投票
1 回答
1093 浏览

c++ - 创建对象的克隆不适用于虚拟基类

运行时:

我的问题与thisthisthis post有关。

在第一个链接中, Space_C0wb0y 说

“由于clone-method是对象实际类的方法,它也可以创建一个深拷贝。它可以访问它所属的类的所有成员,所以没有问题。”

我不明白深拷贝是如何发生的。在上面的程序中,甚至没有发生浅拷贝。即使 Base 类是抽象类,我也需要它工作。我怎样才能在这里做一个深拷贝?请帮忙?

0 投票
3 回答
6882 浏览

c++ - 矢量的深拷贝我的Arr

为了制作深拷贝myArr

哪里Point是一个有 2 个整数作为成员的类,

我需要做一些特别的事情吗?或者可以

我需要删除一些点,otherArr但同时我需要所有点以myArr供以后使用。

提前致谢

0 投票
4 回答
1330 浏览

java - 创建深拷贝方法,Java

我想做一个深拷贝方法。前几天我在这里寻求帮助解决这个问题,但那是针对复制构造函数的。现在我需要一个常规的方法。我创建了代码(非工作),但我只是不完全理解它。

现在当我创建一个名为jadeed的新GhostList,然后在其下创建一个新的ghost数据数组时,它是否知道数据属于jadeed GhostList?我看不出这两者是如何关联的,即使它们应该是关联的。

此外,我没有得到与副本和 this.object 相匹配的长度。我的问题是什么?

0 投票
6 回答
9241 浏览

c++ - 如何(深度)从 const 对象复制地图

我还有一个我似乎无法解决的问题......,或者在这个网站上找到......

我有一个带有映射的对象(称为 DataObject),声明如下:

现在我有一个复制函数(在复制构造函数中使用):

这不会编译,因为 dataElements[i] 在 const 对象上是不可能的。如何对 const 对象拥有的地图中的所有元素进行深层复制?

我知道 find() 函数在 const 映射上是可能的,但是我怎样才能得到我想要复制的实际对象呢?