在C ++中从另一个数组初始化结构内部的数组

时间:2013-03-05 09:25:20

标签: c++ arrays struct

struct sample {
    int x;
    int y;
    int arr[10];
};

int arr2[10] = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5};

int a = 19; 
int b = 22;
struct sample* samp = new sample;
samp->x = a;
samp->y = b;
samp->arr = ??

在上面的例子中,我需要使用 arr2 [10] 元素在 arr [10] 结构中初始化数组。

如何在C ++中完成?

4 个答案:

答案 0 :(得分:3)

你可以使用memcpy:

memcpy(sample->arr,arr2,sizeof(int) * 10)

但我建议使用std :: vector。

答案 1 :(得分:3)

  

如何在C ++中完成?

最简单的解决方案是按照其他人的说法使用std::copy在C ++中使用memcpy,因为std::copy对POD执行相同操作,但也适用于非POD并且只适用于正确的事情。如果数组中的类型更改了一天,则必须重新访问执行此类复制的所有位置并替换memcpy。 (而你错过其中一个地方并且很难找到错误)。在C ++中使用memcpy没有任何好处,因此从一开始就使用std::copy

更好的解决方案是使用C ++数据结构,在这种情况下,使用std::array

#include <array>
struct sample {
      int x;
      int y;
      std::array<int, 10> arr; //C++ array instead of plain C array
    };

int main()
{
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5};

    int a = 19; 
    int b = 22;

    // 1: no need to say "struct sample*" since C++98
    // 2: prefer to use smart pointers..
    //sample* samp = new sample; 
    std::unique_ptr<sample> samp(new sample());
    samp->x = a;
    samp->y = b;
    samp->arr = arr2; //it's as easy as it should be!

    // 3: ... so ypu can't forget to delete!
    //delete samp;
}

修改 我在这里使用了unique_ptr,虽然在这个小例子中你根本不需要使用堆分配。要引入Grijesh的初始化:

int main()
{
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5};

    int a = 19; 
    int b = 22;

    sample samp = {a, b, arr2}; //done!
}

无需分配,无需清理,无需按元素分配。

答案 2 :(得分:1)

使用for循环复制数组,

for(int i=0; i<10; i++) {
    samp->arr[i]=arr2[i];
}

答案 3 :(得分:0)

通常人们会使用std::copy<algorithm>):

std::copy(std::begin(arr2), std::end(arr2), std::begin(samp->arr));

请注意,std::begin()std::end()<iterator>)需要C ++ 11支持。如果您的编译器不支持C ++ 11,您可以自己很容易地提供这些函数或使用指针算术:

std::copy(arr2, arr2 + 10, samp->arr);

令人遗憾的是,你应该尝试将std::vector用于动态数组,或者std::array(c ++ 11)用于固定大小的数组。