使用push_back将vector <double>放入vector <vector <double>&gt;

时间:2016-06-21 09:02:13

标签: c++ stdvector

我有一个this.CreateMap<A, C>() .ForMember(dest => dest.cstr1, exp => exp.MapFrom(scc => scc.str1)) .ForMember(dest => dest.barr1, exp => exp.MapFrom(scc => scc)) .IgnoreAllNonExisting(); this.CreateMap<A, B[]>() .ForMember(dest => dest[0].bstr1, exp => exp.MapFrom(scc => scc.str2)) .ForMember(dest => dest[0].bstr2, exp => exp.MapFrom(scc => scc.str3)) .IgnoreAllNonExisting(); 我想填写一个函数。 我需要在我的程序中为稍后的某些计算存储一些3维坐标。

我的问题是如果我这样做:

std::vector<vector<double>>

清除和重新填充temp会影响数据中的值吗?

我已经找到了http://www.cplusplus.com/reference/vector/vector/push_back/ 但由于解释是&#34; val的内容被复制(或移动)到新元素。&#34;我不知道该怎么想。对我来说,这听起来像是一个矛盾。

我认为如果变量作为参考传递是没有多大意义的,因为它们可以像在我的情况下一样只在有限的范围内有效。 我的假设是对的吗?

3 个答案:

答案 0 :(得分:5)

如果data的类型为std::vector<std::vector<double>>,那么您就可以了:temp值副本将被采用;因此,在您将temp作为push_back参数后,emplace_back可以随意使用// First row of data { std::vector<double> temp = {1, 2, 3}; /*ain't C++11 brilliant?*/ data.emplace_back(std::move(temp)); /*do not use temp after this line - use scope blocks so you're not tempted*/ }

但是,如果你对矢量的分配器搞砸了,那么你可能需要更加小心。

使用安置(请参阅temp)可以避免不必要的深层复制:

nc

可以做一个单行,但实际上我怀疑你想要更加谨慎地填充UserTest2。所以我把两条线分开了。

答案 1 :(得分:1)

正如您在doc中所看到的,push_back函数

有两个重载版本
void push_back (const value_type& val);
void push_back (value_type&& val);

第一个对val进行const引用并将其复制到向量中。第二个使用右值引用(有关详细信息,请参阅move sematics), val移动到向量中,使源向量为空。 它们都不存储对向量内的临时对象的引用。

第一个版本将在您传递时调用,例如,局部变量。

std::vector<std::vector<double>> v;
std::vector<double> lv = {1, 3, 7};
v.push_back(lv);

第二个 - 当您传递临时变量或显式移动变量

v.push_back(std::vector<double>({0, 17, 42}));
v.push_back(std::move(lv));

答案 2 :(得分:1)

“复制”是指push_back(temp)和“(或者移动)”是指push_back(std :: move(temp))