【问题标题】:What is the easiest way to copy a nested vector复制嵌套向量的最简单方法是什么
【发布时间】:2011-07-27 09:35:15
【问题描述】:

在我的代码中,我有一个名为 bead 的结构。我有一个向量,定义为

vector< vector< vector <vector <bead*> > > > boxes

有时,我需要对boxes 进行一些更改,我可能需要恢复这些更改。

如果我执行以下操作会发生什么:

vector< vector <vector <vector <bead*> > > > nBoxes;
nBoxes = boxes;
....
//some code that resizes the forth nest in nBoxes and create new content
....
boxes = nBoxes;

box 中的数据是否会通过应用于 nBoxes 的更改而更改?

这里是珠子的定义:

struct bead{
  particle mainPart;
  int charge;
  int type;
  double rho;
  double nextRho;
  int LID;
  double U;
  double nextU;
  bool touch;
};

这需要particle的定义

struct particle{
  vec pos;
  vec oldPos;
  vec vel;
  vec oldVel;
  vec F;
  vec oldF;
};

vec 是一个类,它包含一个 velarray 参数以及一系列用于操作它的函数。

【问题讨论】:

  • 所有这些嵌套的目的到底是什么?
  • 复制向量的最简单的方法是复制向量。分配始终是复制的最佳选择。请注意,您在容器中使用裸指针。通常这不是一个好主意。那些珠子是动态分配的吗?谁拥有它们?
  • Karl 嵌套是为了说明一些坐标为 x,y,z 的坐标,其中包含 n 个珠子的向量。 @sbi,是的,珠子是动态分配的,它们保存在不同的向量中。

标签: c++ stl copy-constructor


【解决方案1】:

我认为你的意思是

boxes = nBoxes;

最后。

vector 的operator = 复制vector 的内容。也就是说,在您的情况下,它将指针复制到bead。珠子对象本身没有被深度复制。

【讨论】:

  • 因此,我对珠子所做的任何更改都将转移到另一个载体,但我对载体所做的任何更改(移除或添加珠子)都不会转移。太好了,这就是我需要的
  • @Yotam:这正是即将发生的事情。
【解决方案2】:

存储在vector of ...的vector中的数据将被正确复制到您的赋值表达式中。

但是存储在向量中的数据只是指针!因此,每当您从一个向量中更改 bead 数据时,您都会同时更改它,因为这两个向量都只包含一个指向单个内存位置的指针。

【讨论】:

    【解决方案3】:
    nBoxes = boxes;
    

    将制作boxes 向量的完整副本。对nBoxes 的内容所做的任何更改都不会影响boxes 的内容。

    但是:如果您对bead* 指针指向的bead 对象进行更改,那么这些更改也会在boxes 向量中看到。 如果您想避免这种情况,您需要制作矢量的深层副本。

    【讨论】:

      【解决方案4】:

      忘记嵌套向量并实现一个覆盖 operator= 并按照您的意愿行事的自定义类可能是个好主意(复制子向量)

      第二个想法是使用vector&lt; vector&lt; vector &lt;vector &lt;bead&gt; &gt; &gt; &gt; boxes;

      【讨论】:

      • 因为它太复杂并且很难使用它。在这种情况下,自定义类通常会更好。
      • 我不确定我是否明白为什么具有未知语义和任意数量错误的专有类必然优于众所周知的(如果有点复杂)数据结构体。它可能是,但它可能不是。如果有的话,我建议使用适当的 typedef 来合理地命名这些嵌套级别。
      • 可能是个人喜好,但自定义类可以比一般类“变得”更友好。例如: operator[] 选择级别
      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 2010-09-08
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多