有没有办法在C ++中静态初始化动态分配的数组?

时间:2010-09-21 14:12:36

标签: c++ arrays initialization c++11

在C ++中,我可以静态初始化一个数组,例如:

int a[] = { 1, 2, 3 };

是否有一种简单的方法可以将动态分配的数组初始化为一组立即值?

int *p = new int[3];
p = { 1, 2, 3 }; // syntax error

...或者我是否必须手动复制这些值?

6 个答案:

答案 0 :(得分:28)

你可以在C ++ 0x:

int* p = new int[3] { 1, 2, 3 };
...
delete[] p;

但我更喜欢矢量:

std::vector<int> v { 1, 2, 3 };

如果您没有C ++ 0x编译器,boost可以帮助您:

#include <boost/assign/list_of.hpp>
using boost::assign::list_of;

vector<int> v = list_of(1)(2)(3);

答案 1 :(得分:8)

您必须明确指定动态数组的每个元素(例如,在for或while循环中)

但是语法int *p = new int [3]();会将所有元素初始化为0(值初始化$ 8.5 / 5)

答案 2 :(得分:4)

为了避免无休止的push_backs,我通常初始化一个tr1::array并从结果中创建一个std::vector(或任何其他容器标准容器);

const std::tr1::array<T, 6> values = {T(1), T(2), T(3), T(4), T(5), T(6)};
std::vector <T> vec(values.begin(), values.end());

这里唯一的烦恼是你必须明确提供值的数量。

这当然可以在不使用tr1::array的情况下完成;

const T values[] = {T(1), T(2), T(3), T(4), T(5), T(6)};
std::vector <T> vec(&values[0], &values[sizeof(values)/sizeof(values[0])]);

通过你不必明确提供元素的数量,我更喜欢第一个版本。

答案 3 :(得分:2)

使用辅助变量:

const int p_data[] = {1, 2, 3};
int* p = (int*)memcpy(new int[3], p_data, sizeof(p_data));

或,一行

int p_data[] = {1, 2, 3},  *p = (int*)memcpy(new int[3], p_data, sizeof(p_data));

答案 4 :(得分:1)

不,您无法以相同的方式初始化动态创建的数组。

大多数情况下,在静态初始化无论如何都没有意义的情况下,您会发现自己使用动态分配。例如,当您有包含数千个项目的数组时。所以这通常不是什么大问题。

答案 5 :(得分:-1)

从来没有听说过这样的事情,那会很高兴。

请记住,通过代码初始化数组

int a[] = { 1, 2, 3 };

.....只能让你更容易编写代码而不是性能。 毕竟,无论你采用哪种方式,CPU都会为数组分配值。