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

neu*_*rte 13 c++ arrays initialization c++11

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

int a[] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

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

int *p = new int[3];
p = { 1, 2, 3 }; // syntax error
Run Code Online (Sandbox Code Playgroud)

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

fre*_*low 28

你可以在C++ 0x中:

int* p = new int[3] { 1, 2, 3 };
...
delete[] p;
Run Code Online (Sandbox Code Playgroud)

但我更喜欢矢量:

std::vector<int> v { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

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

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

vector<int> v = list_of(1)(2)(3);
Run Code Online (Sandbox Code Playgroud)

  • @neu:如果你甚至不信任`std :: vector`,也许你应该完全放弃C++并使用汇编语言. (6认同)
  • @Poni:没有必要为什么访问一个向量会比访问一个数组慢得多,所以任何声明的测试都只适用于某个编译器,编译器选项和库.请记住,实现可以执行其他检查,许多实现在调试模式下,或者在选择某些编译器选项时执行. (6认同)
  • `+ 1`为`std :: vector`.有什么理由仍然使用自己的动态数组? (5认同)
  • @Poni:我们之前在SO上有这个论点,而且**不是真的.看这里.(http://stackoverflow.com/questions/3664272/3664349#3664349)我们最终确定向量和内置数组之间没有区别. (3认同)
  • @neuviemeporte:哪个访问器功能?如果你觉得你绝对需要保持控制,你可以总是写一些像`int*ptr =&v [0];`和`... ptr [i] ...`,因为(截至2003年)矢量内容存储保证是连续的.只要确保在矢量大小增加时改变`ptr`. (2认同)

Chu*_*dad 8

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

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