【问题标题】:Can I create an array of unique_ptr<T[]>(n), n declared at runtime, without looping on the elements?我可以创建一个 unique_ptr<T[]>(n), n 在运行时声明的数组,而不在元素上循环吗?
【发布时间】: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&lt;int, n&gt; 不允许 n 在运行时变化。

标签: c++ arrays unique-ptr


【解决方案1】:

您正在使用指向原始数组的智能指针的原始数组,这不是 C++ 惯用的。恕我直言,std::array&lt;std::vector&lt;int&gt;, 10&gt; 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); });

【讨论】:

  • 谢谢谢尔盖!!这正是我想要的!是的,一旦你阅读了一些关于 lambda 表达式的知识,它就会变得更加清晰......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2013-07-08
  • 1970-01-01
  • 2017-05-07
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多