【问题标题】:How do I clone a jagged array in a c++ class?如何在 C++ 类中克隆锯齿状数组?
【发布时间】:2020-01-27 07:19:23
【问题描述】:

我有一个模板类,用于创建和操作锯齿状数组。我可以创建锯齿状数组;添加元素;删除它们;修改它们;打印锯齿状数组等。它似乎至少到目前为止我的测试工作,直到我尝试将先前创建的锯齿状数组传递给它以创建另一个。我的班级目前采用传递的内容,并创建看似克隆的内容,但最终成为同一内存空间的别名。所以,当我去改变我认为是克隆的东西时,我最终会改变它们的“两者”。我有点迷茫,想知道是否有人可以给我一些指示?

【问题讨论】:

标签: c++ class templates memory clone


【解决方案1】:

如果没有代码示例,很难准确判断您的问题是什么,但听起来您的数组包含指针。例如:

std::vector<int*> original;
original.push_back(new int[]{1}); // note: for demo only (`new` without `delete` is bad)
std::vector<int*> copy = original;
copy[0][0] = 2; // now original[0][0] also equals 2

由于copy 包含与original 相同的指针,因此original[0]copy[0] 是相同的指针,因此original[0][0]copy[0][0] 指的是同一个对象。

您可以通过复制指向的值而不是指针本身来解决此问题,并将指向副本的指针存储在新数组中。在我的示例中,最简单的方法是使用std::vector&lt;int&gt; 而不是int*

std::vector<std::vector<int>> original;
original.push_back({1});
std::vector<std::vector<int>> copy = original;
copy[0][0] = 2; // original[0][0] still equals 1

【讨论】:

  • 这是一个没有意义的折衷办法。 Asker 的整个问题随着 vectorvectors 而消失。
  • @user4581301 我很困惑。我的示例中的解决方案正是如此。究竟什么是一半?
  • vector&lt;int *&gt; 只比int ** 稍微好一点,并且仍然需要遵守三法则才能安全地复制。 vector&lt;vector&gt; 提供相同的锯齿状数组,并且不需要程序员的任何帮助,因为三法则已融入 vector。如果您打算将vector 用于一半的工作,那么您不妨也将它用于另一半。
  • @user4581301 我只能假设您没有正确阅读我的答案。我举了vector&lt;int*&gt; 的例子,因为听起来 OP 正在做类似的事情。然后我建议一个简单的解决方案是使用vector&lt;vector&lt;int&gt;&gt; 来确保复制基础数据。换句话说,我的建议正是您的建议。
  • 我对此表示认罪,但建议:命令答案以正确的方法引导。如有必要,请返回解释推理。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多