使用new运算符初始化数组

38

我想要以用逗号分隔花括号中的元素的形式初始化一个数组,例如:

int array[10]={1,2,3,4,5,6,7,8,9,10};

然而,我需要使用new运算符来分配内存,例如:

int *array = new int[10];
有没有一种方法可以同时使用`new`运算符分配内存并使用花括号初始化数组?

10
数组不是指针。 - Alex Reynolds
2个回答

58

在新版C++标准(C++11)中,你可以这样做:

int* a = new int[10] { 1,2,3,4,5,6,7,8,9,10 };

它被称为 初始化列表。但在之前的标准版本中是不可能的。

更多详细信息可以在这里找到,但很难读懂。我也尝试了使用GCC和 --std=c++0x 选项来确认它确实有效。


3
我不认为提问者拥有一个兼容C++11的编译器,否则我会接受这个答案。 - Luchian Grigore
@LuchianGrigore 没关系...根据C++11支持矩阵,目前似乎只有GCC是支持初始化列表的主要编译器。 - jogojapan

31

你可以在分配内存之后使用 memcpy 函数。

int originalArray[] ={1,2,3,4,5,6,7,8,9,10};
int *array = new int[10];
memcpy(array, originalArray, 10*sizeof(int) );

我不知道有什么语法可以自动完成这个操作。

后来编辑:

const int *array = new int[10]{1,2,3,4,5,6,7,8,9,10};

6
等价地,std::copy(originalArray, originalArray+10, array) 和它们之间没什么区别。在C++11中,你可以使用std::end(originalArray)代替originalArray+10 - Steve Jessop
@SteveJessop 这是否意味着在C++11中数组保存了大小信息? - Luchian Grigore
1
数组类型包含大小信息,与C++03相同。std::end专门用于数组,使用旧的 T *end(T (&ra)[N]) { return ra + N; }技巧。对于运行时访问,没有存储新信息,并且如果originalArray是指针,则无法工作。 - Steve Jessop
1
更正:重载,而不是特化(因为它是一个函数模板,不能部分特化)。 - Steve Jessop
如果数组是指向常量的指针,你如何实现相同的效果? - martinkunev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接