我有一个班级Atom
:
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 :(得分:1)
您必须使用std::back_inserter:
std::copy ( atoms.begin()+3, atoms.begin() + 4,
std::back_inserter( tmp_atoms));
或者只是
tmp_atoms.push_back(atoms[3]);
答案 1 :(得分:0)
代码std::copy ( atoms.begin() + 3, atoms.begin() + 3, tmp_atoms.begin());
对范围的开始和结束使用相同的迭代器值(atoms.begin() + 3
) - 这意味着,您正在复制空范围。
此外,如果您计划使用&#34;复制&#34;如上所述,您有责任确保目标迭代器(tmp_atoms.begin()
)指向tmp_atoms中的有效位置。如果tmp_atoms为空,则无法先将元素复制到其中而不先调整大小(例如,使用插入迭代器,如建议的其他回复,或类似vector::push_back()
)。