【问题标题】:How to fill an array of unique_ptr?如何填充unique_ptr数组?
【发布时间】:2017-05-12 22:34:43
【问题描述】:

是否可以使用std:fill 填充unique_ptrs 的数组?目的是使不同的对象具有不同的指针,这些对象使用相同的参数进行初始化。

例如:

std::unique_ptr<int> ar[3];
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(1));

【问题讨论】:

  • std::arraystd::initializer_list 是一个选项吗?
  • std::array 是一个选项,但目的不是重复相同的填充元素N
  • 这就是为什么我提出std::initializer_list(或者干脆{}初始化)。
  • @Light 太棒了。我每天都在这里学到新东西。
  • @πάνταῥεῖ:我也没有意识到这一点,但花了整整 10 秒的时间来假设有一个 std::fill 重载或兄弟函数完成了这项工作。然后 10 秒通过 cppreference 确认 :)

标签: c++ arrays c++11 c++14 unique-ptr


【解决方案1】:

不,但这就是std::generate 的用途。

std::generate 没有被赋予一个在整个目标范围内复制的值,而是被赋予了一个“生成器”函数,可以根据需要创建每个值。

所以,大概是这样的:

std::unique_ptr<int> ar[3];
std::generate(
   std::begin(ar),
   std::end(ar),
   []() { return std::make_unique<int>(1); }
);

我没有尝试过,不知道您是否需要摆弄它以避免因不可复制性而引起的问题。希望移动语义就足够了。

(当然,在 C++11 中,你需要your own make_unique function。)

对了,你的.begin().end()写错了(数组没有成员函数),所以(感谢宋元瑶的提醒)我已经更正了。

【讨论】:

  • @songyuanyao:是的:)
  • @Quentin:OP 已标记问题 C++14。如果需要,她或他或它总是可以依靠自制软件make_unique :)
  • @LightnessRacesinOrbit 公平地说,我在 Quentin 的评论之后添加了 C++14 标签:) 看到你的解决方案是最简洁的,但只适用于 C++14。
  • @JeJo:确实。写一个答案!
  • @JeJo:请不要将答案发布为 cmets,谢谢
【解决方案2】:

我不认为你可以用 std::fill() 做到这一点,但用 std::generate() 做这件事是微不足道的:

std::unique_ptr<int> array[10];
std::generate(std::begin(array), std::end(array),
              []{ return std::unique_ptr<int>(new int(17)); });

【讨论】:

    【解决方案3】:

    另一种解决方案:

    std::unique_ptr<int> ar[3];
    
    size_t i;
    for (i = 0; i < elementsof(ar); ++i) {
        ar[i].reset(new int);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2013-09-15
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多