将索引的类型元素从一个向量复制到另一个向量c ++

时间:2017-02-06 18:01:00

标签: c++ class c++11 vector copy

我有一个班级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

我认为复制类类型有一种特殊情况,因为在例如整数向量的情况下这应该是正确的。请帮忙!

2 个答案:

答案 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())。