C++ 将结构化数据投影到std::vector最有效的方法是什么?

C++ 将结构化数据投影到std::vector最有效的方法是什么?,c++,vector,stl,projection,C++,Vector,Stl,Projection,假设我有以下结构类型: struct XStruct { int a_value; int b_value; } struct YStruct { int c_value; int d_value; }; 现在我有了以下向量: std::vector<XStruct> m_x_values; 最有效的方法是什么: 备选案文1: m_y_values.clear(); m_y_values.reserve(m_x_values.size()); for(

假设我有以下结构类型:

struct XStruct {
   int a_value;
   int b_value;
}

struct YStruct {
   int c_value;
   int d_value;
};
现在我有了以下向量:

std::vector<XStruct> m_x_values;
最有效的方法是什么:

备选案文1:

m_y_values.clear();
m_y_values.reserve(m_x_values.size());

for(auto x : m_x_values)
{
    m_y_values.push_back({x.b_value, x.a_value});
}
备选案文2:

m_y_values.resize(m_x_values.size());
int i = 0;
for(auto x : m_x_values)
{
    m_y_values[i].c_value = x.b_value
    m_y_values[i].d_value = x.a_value;
    ++i;
}

还有其他建议吗?

您可以创建第二个结构的构造函数,如下所示:

struct YStruct {
   explicit YStruct(const &XStruct x_struct)
   : c_value(x_struct.a_value)
   , d_value(x_struct.b_value)
   {};

   int c_value;
   int d_value;
};
您将能够使用
y_struct=x_struct
yststruct y_struct(x_struct)

然后简单地将第一个向量的每个元素复制到第二个。可以使用一对迭代器初始化std::vector,这允许使用以下习惯用法:

std::vector<A> new_vect(old_vect.begin(), old_vect.end());
v
是一个
std::vector
需要一个双间接寻址,因为向量包含指向数据所在位置的指针。在一些情况下,我被迫明确使用该方法:

X* vp = &v[0];
for (int i=0,n=v.size(); i<n; i++) {
    vp[i] = ...
}
X*vp=&v[0];

对于(inti=0,n=v.size();iSTL算法
transform
适用于此类问题

std::vector<XStruct> x_values = { { 1, 2 }, {3, 4} };
std::vector<YStruct> y_values(x_values.size());

std::transform(x_values.begin(), x_values.end(), y_values.begin(), [](const XStruct& x){
    return YStruct{ x.b_value, x.a_value };
});

您可以直接构造大小等于m_x_值的m_y_值,因此无需调整大小操作。我将不得不使用
reserve
,因为
resize
将首先初始化新元素的值。对于每个元素,这就像不必要的
=0
一样。使用
emplace_back
而不是
push_back
@Nard,因为他没有构造函数,resize()不会初始化任何东西,对吗?也就是说,没有任何初始化可能会导致将来出现错误。@Alexiswillke他没有构造函数,因此编译器将生成默认构造函数、复制构造函数、复制赋值运算符以及析构函数。(C++11之前)为了安全起见,我将为此构造函数添加一个
显式
关键字,这样执行此转换的人就应该知道他们想要执行此转换。如果可以使用
y_struct=x_struct;
也可以像
m_y_values=m_x_values;
中那样直接复制向量,对吗?(除非添加显式的
)@纳德:是的,谢谢,编辑了这篇文章。但也许这个结构应该是透明的可转换的,所以没有必要使用
显式的
。@Alexis Wilke:我想是的,但没有保证。@Heavy当然,但我宁愿安全,也不愿让我的用户不眠不休地调试编译器的隐式转换。谢谢!The
emplace\u back
必须是最有效的方法,特别是如果您在向量中保留了正确的容量。但是您必须在不使用构造函数的情况下传递参数,即
y\u值。emplace\u back(x.b\u值,x.a\u值);
X* vp = &v[0];
for (int i=0,n=v.size(); i<n; i++) {
    vp[i] = ...
}
std::vector<XStruct> x_values = { { 1, 2 }, {3, 4} };
std::vector<YStruct> y_values(x_values.size());

std::transform(x_values.begin(), x_values.end(), y_values.begin(), [](const XStruct& x){
    return YStruct{ x.b_value, x.a_value };
});
std::vector<XStruct> x_values = { { 1, 2 }, {3, 4} };
std::vector<YStruct> y_values;

for (const auto& x : x_values){
    y_values.emplace_back(YStruct{ x.b_value, x.a_value });
}