2017-02-06 8 views
-1

У меня есть класс Atom:Копировать класс-тип элемента по индексу от одного вектора к другому C++

class Atom { 
     public: 
       Atom(); 
       string name; string mol_name; string MF; // element, molecule name, movable/frozen 
       int mol_id; 
       double m,eps,sig,C=0.0,V=0.0,K=0.0,E=0.0; 
       int ID; 
       map <string,double> pos; // equivalent of python FM1.9 "x" 
       map <string,double> prevpos; 
       map <string,double> force; // " " F 
       map <string,double> vel; // v 
       map <string,double> acc; // a 
       map <string,double> dip; // dipole 
       map <string,double> efield; // electric field; 
}; 

и вектор таких атомов atoms:

vector<Atom> atoms, который заполняется различными атомами (0,1,2 ...) и соответствующие переменные, например name.

Я хочу скопировать, например. atoms[3] - другому вектору tmp_atoms. Я пытаюсь:

std::copy (atoms.begin() + 3, atoms.begin() + 3, tmp_atoms.begin());

без толку, потому что, когда я пытаюсь получить доступ к tmp_atoms[0] или tmp_atoms[3] я получаю ошибку сегментации. Моя попытка доступа: printf("Make sure tmp_atoms[0] is a thing: %s \n", tmp_atoms[0].name.c_str()); // program seg. faults here

Я думаю, что есть специальный случай для копирования типов классов, потому что это должно быть правильно в случае, например, векторов целых чисел. Пожалуйста помогите!

+0

объяснять downvote? – khaverim

+1

Пожалуйста, ** ** ваш вопрос с [mcve] или [SSCCE (Short, Self Contained, Correct Example)] (http://sscce.org) – NathanOliver

+0

Это примерно как mcve, как я могу это сделать. Goal = копировать векторный элемент, который сам является экземпляром класса, другому вектору – khaverim

ответ

1

Вы должны использовать std::back_inserter:

std::copy (atoms.begin()+3, atoms.begin() + 4, 
      std::back_inserter(tmp_atoms)); 

Или просто

tmp_atoms.push_back(atoms[3]); 
+0

еще seg-неисправность. Думаю, что это не похоже на копирование содержимого класса. Когда я делаю 'printf (« Удостоверьтесь, что tmp_atoms [0] - вещь:% s \ n ", tmp_atoms [0] .name.c_str()); появляется ошибка seg. – khaverim

+0

Я сделал небольшое редактирование, пожалуйста, проверьте его – Steephen

+0

Использование 'back_inserter' работало так же, как в вашем первом примере, ty. – khaverim

0

Код std::copy (atoms.begin() + 3, atoms.begin() + 3, tmp_atoms.begin()); использует то же значение итератора (atoms.begin() + 3) и для начала и конца диапазона - это означает, , вы копируете пустой диапазон.

Кроме того, если вы планируете использовать «копию», как указано выше, вы несете ответственность за то, чтобы ваш целевой итератор (tmp_atoms.begin()) указывал на действительную позицию в tmp_atoms. Если tmp_atoms пуст, вы не можете копировать в него элементы, не изменяя его сначала (например, используя вставку итератора, как и другой ответ, или что-то вроде).

+0

Я не знаю, почему люди занижают, но спасибо за информацию. Не знал, что один и тот же индекс не приведет к копированию. – khaverim

+1

Это обычное соглашение с итераторами. Каждый раз, когда вы имеете дело с API, который принимает два итератора, первый итератор указывает на первый элемент из последовательности, тогда как второй итератор («конец») указывает на одно прошлое - последний элемент (и не обязательно должен быть разуплотняемым). –

+1

Идея о нисходящем движении. Но о вашем образце кода - «проверяемый» означает код, который кто-то может компилировать и запускать напрямую, без добавления каких-либо «включенных» операторов, «основной» функции и т. Д. - другими словами, без каких-либо предположений о остальной части вашего кода. –