Какой самый простой способ скопировать вложенный вектор - PullRequest
2 голосов
/ 27 июля 2011

В моем коде у меня есть структура с именем 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;

Будут ли изменены данные в полях в результате изменений, внесенных в 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 вместе с набором функций для управления им.

Ответы [ 4 ]

3 голосов
/ 27 июля 2011

Я думаю, что вы имели в виду

boxes = nBoxes;

в конце.

operator = вектора копирует содержимое vector.То есть в вашем случае он копирует указатели на bead.Сами объекты из бисера не копируются глубоко.

2 голосов
/ 27 июля 2011

Данные, хранящиеся в векторе вектора ..., будут правильно скопированы в ваши выражения присваивания.

НО данные, хранящиеся в ваших векторах, являются только указателями!Следовательно, всякий раз, когда вы изменяли данные bead из одного вектора, вы изменяете их в обоих, поскольку оба вектора содержат только указатель на одну ячейку памяти.

1 голос
/ 27 июля 2011
nBoxes = boxes;

сделает полную копию вектора boxes. Любые изменения, внесенные в содержимое nBoxes, не влияют на содержимое boxes.

Однако: если вы вносите изменения в объекты bead, на которые указывают указатели bead*, эти изменения также будут отображаться в векторе boxes. Если вы хотите избежать этого, вам нужно сделать глубокую копию вектора.

0 голосов
/ 27 июля 2011

Вероятно, неплохо бы забыть о вложенных векторах и реализовать собственный класс, который переопределяет operator = и ведет себя так, как вы хотите (копирование подвекторов)

Вторая идея заключается в использовании vector< vector< vector <vector <bead> > > > boxes;

...