我想填写一个如下所示的结构:
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
的错误。我不知道这意味着什么...
答案 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); });