20

如何在堆上手动启动数组中的值?如果数组是局部变量(在堆栈中),则可以非常优雅且简单地完成,如下所示:

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

不幸的是,下面的代码

int * myArray = new int[3];
myArray = {1,2,3};

通过编译输出错误

error: expected primary-expression before ‘{’ token
error: expected `;' before ‘{’ token

我必须使用循环,或者像这样不那么优雅的方式吗?

myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
4

7 回答 7

6

今天可以使用以下语法来完成:

int * myHeapArray = new int [3] {1, 2, 3};

请注意,您必须将分配的结构的大小与初始化列表的大小相匹配。

由于我在回答几年前发布的问题,因此值得一提的是,现代 C++ 不鼓励使用new,delete和本机(或裸)指针。std::unique_ptr更喜欢使用和之类的处理程序std::shared_ptr,因为它们会自动释放它们拥有的内存(检查RAII idiom)。

在这种特殊情况下,std::vector将提供所有这些特性:堆分配数据、使用初始化列表(如{1, 2, 3})、处理程序和移动语义等特性。

对于堆栈分配的数组,您可以考虑std::array,如果您需要它们。

于 2020-04-16T09:04:03.643 回答
5

这很有趣:将数组推入向量

但是,如果这对您不起作用,请尝试以下操作:

#include <algorithm>
...


const int length = 32;

int stack_array[length] = { 0 ,32, 54, ... }
int* array = new int[length];

std::copy(stack_array, stack_array + length, &array[0]);
于 2010-12-31T17:35:51.980 回答
3

您可以定义常量数组,例如 myConstArray[] = {1, 2, 3} 并在 new int[3] 之后执行 memcpy。

于 2010-12-31T16:33:54.373 回答
3

{1,2,3}是一种非常有限的语法,特定于 POD 结构初始化(显然 C 风格的数组也被认为是一种)。你唯一能做的就是喜欢int x[] = {1,2,3};or int x[3] = {1,2,3};,但你不能既不做int x[3]; x={1,2,3};也不{1,2,3}在任何其他地方使用。

如果您正在使用 C++,最好使用 std::vector 之类的东西而不是 C 样式的数组,因为它们被认为是危险的 - 例如,您无法知道它们的大小并且必须使用 a 删除它们delete[],而不是 normal delete。但是,使用 std::vector 您仍然会遇到相同的初始化问题。如果我经常使用这种初始化,我很可能会创建一个分配给虚拟局部变量的宏,然后将内存复制到目标。

编辑:您也可以这样做(std::vector 仍然更可取):

int* NewArray(int v1, int v2, int v3) { /* allocate and initialize */ }
int* p = NewArray(1,2,3);

但是你必须用不同数量的参数覆盖函数,或者使用 va_arg ,这又是不安全的。

EDIT2:我的回答仅对 C++03 有效,因为其他人提到 C++0x 对此有一些改进。

于 2010-12-31T17:29:50.170 回答
0

C++0x 标准具有称为的特殊类型initializer_list及其特殊语法(表达式类型{1, 2, 3}std::initializer_list<int>)。std::vectorstd::array从中获得构造函数,因此您可以编写vector<int> v = {1, 2, 3}.

在 C++98/C++03 中没有好的解决方案。

于 2010-12-31T17:39:13.240 回答
0

如果您想要一个适用于所有类型的通用答案,那么您要做的是:

  1. malloc() 或 operator new() 创建一个正确长度的未初始化存储数组,由 nelts * sizeof(T) 计算

  2. 为每个元素创建一个包含构造函数参数的数组。

  3. 使用相应的参数以放置形式将构造函数应用于每个元素。

这仅适用于每个元素都使用相同的构造函数。如果没有,您将需要更复杂的数据结构和算法来为每个元素选择正确的构造函数。

这种情况的一个特殊情况是使用实际元素的数组并使用复制构造函数,一种特殊情况是当类型是 POD 并且您可以使用 memcpy 一次构造该批次。

如果构造函数有两个参数,您将需要编写一个启动程序(包装器)。例如:

pair<double> init_data[] = {make_pair(1.0,0.0), make_pair(3.0,4.0)};
void init(void *p, pair<double> d) { new (p) complex(d.first, d.second); }

并使用它而不仅仅是 new(p)。

于 2010-12-31T17:43:17.580 回答
0

您也可以按如下方式对其进行初始化:

int * myArray = new int[3];
*myarray=1;
*(myarray+1)=2;
*(myarray+2)=3;
于 2021-12-01T07:59:49.227 回答