我可以创建一个 unique_ptr<T[]>(n) 的数组,n 在运行时声明,而不循环元素吗?
Can I create an array of unique_ptr<T[]>(n), n declared at runtime, without looping on the elements?
我想填充如下所示的结构:
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
的错误。我不知道那是什么意思...
您正在使用指向原始数组的智能指针的原始数组,这不是 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); });
我想填充如下所示的结构:
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
的错误。我不知道那是什么意思...
您正在使用指向原始数组的智能指针的原始数组,这不是 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); });