我可以创建一个在运行时声明的unique_ptr <t []>(n),n数组,而不会在元素上循环吗?

时间:2018-06-15 09:38:45

标签: c++ arrays unique-ptr

我想填写一个如下所示的结构:

unique_ptr<int[]> myArray[10];

每个unique_ptr是一个大小为n的数组,在运行时定义但保持不变。

有没有办法初始化myArray声明中的所有内容?或者至少不必明确地循环遍历unique_ptr中的每个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的错误。我不知道这意味着什么...

1 个答案:

答案 0 :(得分:2)

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

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

事实上,生成unque_ptr的正确方法是通过make_unique,因此上述行应该重写为(感谢BenVoigt注意):

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