gpt4 book ai didi

c++ - 如何一次将多个 unique_ptr 插入 vector

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:52 28 4
gpt4 key购买 nike

我有一个 vector :

std::vector<std::unique_ptr<int>>

并想插入几个新的unique_ptr<int>在指定位置放入其中。有成员函数 std::vector::insert(iterator position, size_type n, const value_type& val)但唉,复制的限制unique_ptr的不允许使用此重载。

我已阅读 this question , 然而这是为了插入 unique_ptr已经存在于另一个 vector 中。我想创建新的。

我意识到我可以用一个循环来做到这一点,例如将 3 个新项目插入 vector 的开头:

for (int n = 0; n != 3; ++n)
vec.insert(vec.begin(), std::make_unique<int>(0));

但是我想知道是否有一种更简洁的方法来执行此操作,并且可能是一种预先分配新内存的方法。

编辑澄清:要添加到 vector 中的项目数量是完全任意的 - 我在示例代码中写了 3,但它可以是任何值,不一定是编译时已知的值。

最佳答案

这里分配了两种不同类型的内存。 vector 中为 unique_ptr 本身分配了内存(不会很多,每个 unique_ptr 只是一个指针)。然后为每个 unique_ptr 管理的对象动态分配内存。

您不能预先分配所有 内存,因为每个unique_ptr 中的对象的动态分配内存必须单独分配。

但是如果你想避免由于多次 insert 调用而重新分配 vector 的内存,你可以先做一个保留:

vec.reserve(vec.size() + n);

我怀疑它会对小至 3 的 n 产生任何影响。

更多的问题是,对于每个 insert,vector 必须将 vector 的所有内容在插入点之后移动一个。移动 unique_ptr 很便宜,但它可以加起来。

它当然不干净,但您可以使用 std::move_backward 自己移动一次。将 vector 调整为所需的大小,移动所有元素,然后在要插入的元素中移动分配 unique_ptr:

auto prev_size = vec.size();
vec.resize(prev_size + 3);
auto prev_end = vec.begin() + prev_size;
std::move_backward(vec.begin(), prev_end, vec.end());
for (int n = 0; n != 3; ++n)
vec[n] = std::make_unique<int>(0);

另一种可能更简洁的方法是创建您自己的自定义前向迭代器以在 std::vector::insert(const_iterator position, InputIterator first, InputIterator last); insert 的 重载:

template<typename T>
struct UniquePtrInserter : std::iterator<
std::forward_iterator_tag,
std::unique_ptr<T>,
std::ptrdiff_t,
const std::unique_ptr<T>*,
std::unique_ptr<T>>{
int n_;
public:
explicit UniquePtrInserter<T>(int n = 0) : n_(n) {}
UniquePtrInserter<T>& operator++() {n_++; return *this;}
bool operator==(UniquePtrInserter<T> other) const {return n_ == other.n_;}
bool operator!=(UniquePtrInserter<T> other) const {return !(*this == other);}
std::unique_ptr<T> operator*() const {return std::make_unique<T>(); }
};

vec.insert(vec.begin(), UniquePtrInserter<int>(0), UniquePtrInserter<int>(3));

关于c++ - 如何一次将多个 unique_ptr 插入 vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39477640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com