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 ++中完成?
答案 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)用于固定大小的数组。