【问题标题】:Copy a class-type element by index from one vector to another c++ [closed]按索引将类类型元素从一个向量复制到另一个c ++ [关闭]
【发布时间】:2017-06-23 18:43:50
【问题描述】:

我有一堂课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&lt;Atom&gt; 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

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

【问题讨论】:

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


【解决方案1】:

你必须使用std::back_inserter:

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

或者干脆

 tmp_atoms.push_back(atoms[3]);

【讨论】:

  • 仍然存在段错误。我认为它似乎没有复制课程内容。当我执行printf("Make sure tmp_atoms[0] is a thing: %s \n", tmp_atoms[0].name.c_str()); 时,会出现段错误。
  • 我做了一个小修改,请检查一下
  • back_inserter 的使用与您的第一个示例一样,ty。
  • (我之前试过这个,但back_inserter的语法不正确)
【解决方案2】:

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

此外,如果您打算使用上述“复制”,您有责任确保您的目标迭代器 (tmp_atoms.begin()) 指向 tmp_atoms 中的有效位置。如果 tmp_atoms 为空,则必须先调整其大小才能将元素复制到其中(例如,使用插入迭代器,如其他回复建议的那样,或类似 vector::push_back() 的东西)。

【讨论】:

  • 我不知道人们为什么投反对票,但感谢您提供的信息。不知道相同的索引会导致没有副本。
  • 这是迭代器的常见约定。每当你处理一个需要两个迭代器的 API 时,第一个迭代器指向序列中的第一项,而第二个迭代器(“end”)指向过去的最后一项(并且不必是可取消引用的) )。
  • 不知道投反对票。但是关于您的代码示例-“可验证”意味着有人可以直接编译和运行的代码,而无需添加任何“包含”语句、“主”函数等-换句话说,无需对您的其余代码做出任何假设。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多