繁体   English   中英

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

[英]Is there a way to statically-initialize a dynamically-allocated array in C++?

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

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

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

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

...还是我绝对必须手动复制这些值?

您可以在 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);

您必须显式分配动态数组的每个元素(例如在 for 或 while 循环中)

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

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

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])]);

虽然您不必明确提供元素的数量,但我更喜欢第一个版本。

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

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

使用辅助变量:

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));

从来没有听说过这样的事情可能,那会很好。

请记住,通过以这种方式在代码中初始化数组

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

..... 只会让您更轻松地编写代码,而不是性能 毕竟,无论您采用哪种方式,CPU 都会完成为数组赋值的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM