8
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

4 回答 4

3

如何在 C++ 中做到这一点?

最简单的解决方案是std::copy按照其他人所说的那样使用。不要在 C++ 中使用,对于 POD 也是如此,但也适用于非 POD,只是做正确的事。如果您的数组中的类型有一天发生了变化,您将不得不重新访问您进行此类复制的所有地方并替换. (而且你错过其中一个地方并且很难找到错误)。在 C++ 中使用没有任何好处,所以从一开始就使用。memcpystd::copymemcpymemcpystd::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!
}

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

于 2013-03-05T09:49:41.950 回答
2

你可以使用 memcpy:

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

但我建议两者都使用 std::vector 。

于 2013-03-05T09:27:45.433 回答
1

使用 for 循环复制数组,

for(int i=0; i<10; i++) {
    samp->arr[i]=arr2[i];
}
于 2013-03-05T09:34:25.640 回答
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) 用于固定大小的数组。

于 2013-03-05T09:39:38.970 回答