2017-02-06 106 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”函数等等,换句话说,不需要对代码的其他部分做任何假设。 –

相关问题