2017-02-06 54 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

這就像我能做到的那樣。目標=將一個向量元素(它本身就是一個類實例)複製到另一個向量中 – 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

仍然存在問題。我認爲,它似乎沒有複製班級內容。當我做'printf(「確保tmp_atoms [0]是一件東西:%s \ n」,tmp_atoms [0] .name.c_str());'出現seg-fault。 – 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爲空,則不能將元素複製到其中,而無需先調整元素(例如,使用插入迭代器,如提供的其他回覆,或類似vector::push_back())。

+0

我不知道人們爲什麼downvoting,但感謝您的信息。不知道相同的索引會導致沒有副本。 – khaverim

+1

這是迭代器的通用慣例。每當你處理一個需要兩個迭代器的API時,第一個迭代器指向序列中的第一個項目,而第二個迭代器(「end」)指向一個過去的最後一個項目(並且不必是可忽略的)。 –

+1

不知道downvoting。但是關於你的代碼示例 - 「可驗證的」意味着代碼有人可以直接編譯和運行,而不需要添加任何「include」語句,「main」函數等等,換句話說,不需要對代碼的其他部分做任何假設。 –

相關問題