【问题标题】:std::transform to copy one array of struct to anotherstd::transform 将一个结构数组复制到另一个
【发布时间】:2020-06-05 14:14:38
【问题描述】:

我有以下结构。

typedef struct
{
    uint32_t   aa;        
    float32_t  bb;  
    float32_t  cc;  
    float32_t  dd;    
    float32_t  ee;    
}struct_1;

typedef struct
{
    uint32_t   hh;        
    float32_t  bb;  
    float32_t  cc;  
    float32_t  ii;    
    float32_t  jj;    
}struct_2;

我创建了结构数组,其中 struct_1 是动态分配的,而 struct_2 是静态的。

struct_1 *array1 = new struct_1[300];
struct_2 array2[300];

如何有效地将内容从array2复制到array1? 我不想在这里 memcpy,因为如果将来任何结构的类型发生变化,那么它会导致问题。

我可以在这种情况下使用 std::transform 或 std::copy 吗?请帮我语法。

【问题讨论】:

  • 你可以写一个循环来复制成员,算法也不会做任何实质性的不同
  • 另外,在 C++ 中,结构是类,这意味着它们是类型。不需要typedef。在您的情况下,struct struct_1 { // }; 就足够了。

标签: c++ c++11 c++14


【解决方案1】:

您可以使用std::transform 并提供转换函数:

std::transform(std::begin(array2), std::end(array2), array1, [](const struct_2& val) {
     return struct_1{val.hh, val.bb, val.cc, val.ii, val.jj};
});

【讨论】:

  • 不错的答案,但最终使用 cbegin() 而不是 begin()。
【解决方案2】:

使用循环可能更容易:

struct_1* a1_p = array1;
for (const struct_2& s2 : array2) {
    *a1_p++ = struct_1{ s2.hh, s2.bb, s2.cc, s2.ii, s2.jj };
}

这也可以让您只设置struct_1 的一些成员(例如,如果您添加了更多成员并且只想覆盖来自struct_2 的相应成员):

struct_1* a1_p = array1;
for (const struct_2& s2 : array2) {
    struct_1& s1 = *a1_p++;
    s1.aa = s2.hh;
    s1.bb = s2.bb;
    s1.cc = s2.cc;
    s1.dd = s2.ii;
    s1.ee = s2.jj;
    // Any members not set will remain the same
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2022-07-05
    • 1970-01-01
    相关资源
    最近更新 更多