在C++中,我可以静态初始化一个数组,例如:
int a[] = { 1, 2, 3 };
有没有一种简单的方法将动态分配的数组初始化为一组立即值?int *p = new int[3];
p = { 1, 2, 3 }; // syntax error
我必须手动复制这些值吗?
在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);
std::vector
给个 +1
。仍然使用自己的动态数组的原因是什么? - sbistd::vector
,也许你应该彻底放弃C++,转而使用汇编语言。 - fredoverflowint *ptr = &v[0]
和... ptr[i] ...
,因为(截至2003年)矢量内容存储是被保证连续的。只要确保在向量大小增加时更改ptr
即可。 - David Thornley你需要显式地为动态数组的每个元素赋值(例如在for或while循环中)
不过,语法int *p = new int [3]();
可以将所有元素初始化为0(值初始化$8.5/5)
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));
new
)。原因是函数参数的求值顺序是未指定的,所以你可能会动态分配内存,然后另一个参数的求值可能会抛出异常,这时那个动态分配的对象就会被泄漏。Herb Sutter 有更多的解释。 - James McNellis不,你不能以同样的方式初始化动态创建的数组。
大多数情况下,您会发现自己在使用动态分配时,静态初始化并没有太多意义。例如当您有包含数千个项目的数组时。因此,这通常不是一个大问题。
从未听说过有这样的事情是可能的,那将是很不错的。
请记住,在代码中以那种方式初始化数组。
int a[] = { 1, 2, 3 };
......只会让你更容易编写代码,而不是提高性能。毕竟,无论你怎么做,CPU 都会负责将值分配给数组。