【问题标题】:Use new operator to initialise an array使用 new 运算符初始化数组
【发布时间】:2012-03-25 02:40:57
【问题描述】:

我想以使用逗号分隔花括号中的元素的格式初始化一个数组,例如:

int array[10]={1,2,3,4,5,6,7,8,9,10};

但是,我需要使用 new 运算符来分配内存,例如:

int *array = new int[10];

有没有办法结合这些方法,以便我可以使用 new 运算符分配内存并使用花括号初始化数组?

【问题讨论】:

  • 数组不是指针。

标签: c++ arrays new-operator


【解决方案1】:

在新的 C++ 标准 (C++11) 中,您可以这样做:

int* a = new int[10] { 1,2,3,4,5,6,7,8,9,10 };

它被称为初始化列表。但在以前的标准版本中这是不可能的。

具有更多详细信息(并且很难阅读)的相关在线参考是here。我还使用 GCC 和 --std=c++0x 选项进行了尝试,并确认它确实有效。

【讨论】:

  • +1 我认为 op 没有兼容 C++11 的编译器,否则我会接受这个答案。
  • @LuchianGrigore 没关系...事实上,根据C++11 support matrix,GCC 似乎是迄今为止唯一支持初始化列表的主要编译器。
【解决方案2】:

分配后可以使用memcpy。

int originalArray[] ={1,2,3,4,5,6,7,8,9,10};
int *array = new int[10];
memcpy(array, originalArray, 10*sizeof(int) );

我不知道有什么语法可以让您自动执行此操作。

稍后编辑:

const int *array = new int[10]{1,2,3,4,5,6,7,8,9,10};

【讨论】:

  • 或者等效地,std::copy(originalArray, originalArray+10, array),它们之间没有太多选择。在 C++11 中,您可以使用 std::end(originalArray) 代替 originalArray+10。
  • @SteveJessop 这是否意味着该数组包含 C++11 中的大小信息?
  • 数组的类型包括大小,和C++03一样。 std::end 专门用于数组,使用旧的 T *end(T (&ra)[N]) { return ra + N; } 技巧。没有为运行时访问存储新信息,如果 originalArray 是指针,它将无法工作。
  • 更正:重载,未特化(因为是函数模板,不能部分特化)。
  • 如果array是指向const的指针,怎么能达到同样的效果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2011-11-24
  • 2023-01-02
  • 2011-01-13
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多