【发布时间】:2018-06-15 09:38:45
【问题描述】:
我想填充一个如下所示的结构:
unique_ptr<int[]> myArray[10];
每个unique_ptr 都是一个大小为n 的数组,在运行时定义,但保持不变。
有没有办法初始化myArray 声明中的所有内容?或者至少不必明确地循环遍历myArray 中的每个unique_ptr?
因为目前我发现的最简单的解决方案是添加:
for(auto & it : myArray)
it.reset(new int[n]);
但是感觉有了对 C++ 的所有这些很酷的改进,将有一种更简单的方法来初始化一个由 10 个恒定大小数组组成的数组n。
我尝试了类似的方法:
generate_n(std::begin(myArray), 10, []{ return std::unique_ptr<int[]>(new int[n]); });
但我收到关于隐式捕获 n 的错误。我不知道这意味着什么......
【问题讨论】:
-
[]{ /**/ });->[n]{ /**/ });捕获n。为什么要避免简单的 for 循环?std::generate是一个更复杂的解决方案... -
使用单个循环初始化数组并没有什么可耻的。保持简单。
-
这里的棘手问题是
new int(n)分配了一个使用n值初始化的int(由于delete[]调用不匹配,这也会导致未定义的行为)。数组分配看起来像new int[n] -
另请注意,指向数组或向量的指针很少有用。除非您想要
std::unique_ptr的所有权语义。 -
@Payne:
std::array<int, n>不允许n在运行时变化。
标签: c++ arrays unique-ptr