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

Copy a class-type element by index from one vector to another c++

本文关键字:向量 一个 复制 c++ 另一个 索引 类型 元素      更新时间:2023-10-16

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

我认为复制类类型有一个特殊情况,因为这在整数向量的情况下应该是正确的。请协助!

你必须使用 std::back_inserter:

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

或者干脆

 tmp_atoms.push_back(atoms[3]);

代码std::copy ( atoms.begin() + 3, atoms.begin() + 3, tmp_atoms.begin());对范围的开始和结束使用相同的迭代器值 ( atoms.begin() + 3 ( - 这意味着您正在复制一个空范围。

此外,如果您打算使用上述"copy",则您有责任确保目标迭代器(tmp_atoms.begin()(指向tmp_atoms内的有效位置。 如果tmp_atoms为空,则如果不先调整元素大小,则无法将元素复制到其中(例如,使用插入迭代器,如建议的其他回复,或类似 vector::push_back() (。