在C ++中,我可以静态初始化一个数组,例如:
int a[] = { 1, 2, 3 };
是否有一种简单的方法可以将动态分配的数组初始化为一组立即值?
int *p = new int[3];
p = { 1, 2, 3 }; // syntax error
...或者我是否必须手动复制这些值?
答案 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都会为数组分配值。