如何填充unique_ptr数组?

How to fill an array of unique_ptr?

本文关键字:ptr 数组 unique 何填充 填充      更新时间:2023-10-16

是否可以使用std:fill来填充unique_ptr数组?目的是具有指向使用相同参数初始化的不同对象的不同指针。

例如:

std::unique_ptr<int> ar[3];
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(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 中,您将需要自己的make_unique函数。

顺便说一下,你的.begin().end()是错误的(数组没有成员函数),所以(感谢松元瑶的提醒)我已经纠正了这些。

我不认为你可以用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)); });

另一种解决方案:

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