有没有一种方法可以静态初始化C+中动态分配的数组+;? 在C++中,我可以静态初始化数组,例如: int a[] = { 1, 2, 3 };

有没有一种方法可以静态初始化C+中动态分配的数组+;? 在C++中,我可以静态初始化数组,例如: int a[] = { 1, 2, 3 };,c++,arrays,initialization,c++11,C++,Arrays,Initialization,C++11,有没有一种简单的方法可以将动态分配的数组初始化为一组立即值 int *p = new int[3]; p = { 1, 2, 3 }; // syntax error …或者我必须手动复制这些值吗?不,您不能以相同的方式初始化动态创建的数组 大多数情况下,您会发现自己在静态初始化毫无意义的情况下使用动态分配。例如,当您有包含数千项的数组时。所以这通常不是什么大问题。不,不能用同样的方法初始化动态创建的数组 大多数情况下,您会发现自己在静态初始化毫无意义的情况下使用动态分配。例如,当您有包含数千

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

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

…或者我必须手动复制这些值吗?

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


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

不,不能用同样的方法初始化动态创建的数组


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

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


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

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

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

您可以在C++0x中:

int* p = new int[3] { 1, 2, 3 };
...
delete[] p;
但我更喜欢向量:

std::vector<int> v { 1, 2, 3 };
std::向量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);
#包括
使用boost::assign::list_;
向量v=第(1)(2)(3)项的列表;
您可以在C++0x中:

int* p = new int[3] { 1, 2, 3 };
...
delete[] p;
但我更喜欢向量:

std::vector<int> v { 1, 2, 3 };
std::向量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);
#包括
使用boost::assign::list_;
向量v=第(1)(2)(3)项的列表;

从未听说过这样的事情,拥有这样的事情会很好

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

int a[] = { 1, 2, 3 };
。。。。。只会让您更容易编写代码,而不会提高性能。
毕竟,无论采用哪种方式,CPU都会为数组赋值。

从来没有听说过这样的事情,拥有它会很好

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

int a[] = { 1, 2, 3 };
。。。。。只会让您更容易编写代码,而不会提高性能。 毕竟,CPU将完成为数组赋值的工作,无论您采用哪种方式。

使用helper变量:

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));
使用辅助变量:

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

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

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
,并从结果中创建
std::vector
(或任何其他容器std container)

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

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

+1
对于
std::vector
。还有什么理由使用你自己的动态数组?@ NEU:如果你甚至不相信<代码> STD::向量,也许你应该完全放弃C++,去汇编语言。@ Poni:没有必要的理由来访问向量比访问数组慢得多。因此,任何声明其他方面的测试只适用于特定的编译器、编译器选项和库。请记住,一个实现可以执行额外的检查,许多实现在调试模式下或选择某些编译器选项时可以执行这些检查。@neuviemeporte:哪些访问器起作用?如果您觉得绝对需要保持控制,您可以编写类似于
int*ptr=&v[0]的代码
…ptr[i]…
,因为(从2003年起)向量内容存储保证是连续的。只要确保在向量大小增加时更改
ptr
。@Poni:我们以前有过这个参数,所以它不是真的。看这里。()其中,我们最终证明向量和内置数组之间没有区别。
+1
对于
std::vector
。还有什么理由使用你自己的动态数组?@ NEU:如果你甚至不相信<代码> STD::向量,也许你应该完全放弃C++,去汇编语言。@ Poni:没有必要的理由来访问向量比访问数组慢得多。因此,任何声明其他方面的测试只适用于特定的编译器、编译器选项和库。请记住,一个实现可以执行额外的检查,许多实现在调试模式下或选择某些编译器选项时可以执行这些检查。@neuviemeporte:哪些访问器起作用?如果您觉得绝对需要保持控制,您可以编写类似于
int*ptr=&v[0]的代码
…ptr[i]…
,因为(从2003年起)向量内容存储保证是连续的。只要确保在向量大小增加时更改
ptr
。@Poni:我们以前有过这个参数,所以它不是真的。看这里。()这里我们可以得出结论,向量和内置数组之间没有区别。作为一般规则(也是一个好习惯),您不应该在函数调用中动态分配对象(也就是说,您永远不应该在函数的参数中调用
new
)。原因是函数参数的求值顺序未指定,因此最终可能会动态分配内存,然后另一个参数的求值可能会引发异常,然后动态分配的对象将泄漏+尽管这有点神秘,而且只适用于豆荚。詹姆斯·麦克内利斯,一般规则只是一般规则。他们有一个解释