3

我想填充一个看起来像这样的结构:

unique_ptr<int[]> myArray[10];

每个unique_ptr都是 size 的数组n,在运行时定义但保持不变。

有没有办法初始化声明中的所有内容myArray?或者至少不必明确地循环遍历每个unique_ptrin myArray

因为目前我发现的最简单的解决方案是添加:

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。我不知道那是什么意思...

4

1 回答 1

2

您正在使用指向原始数组的智能指针的原始数组,这不是 C++ 惯用的。恕我直言,std::array<std::vector<int>, 10> MyArray;以后会更容易使用。无论如何,错误消息很容易解释:您n在 lambda 函数中使用变量而不捕获它。编译器只需要:

generate_n(std::begin(myArray), 10, [n]{ return std::unique_ptr<int[]>(new int[n]); });

实际上,生成 a 的正确方法unque_ptr是 through make_unique,所以上面的行应该重写为(感谢 BenVoigt 的注意):

generate_n(std::begin(myArray), 10, [n]{ return make_unique<int[]>(n); });
于 2018-06-15T14:15:01.503 回答