如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?

How to insert n contiguous elements into a std::vector whose element type is non-copyable?

本文关键字:元素 可复制 std vector 连续 插入 类型      更新时间:2023-10-16

我想将n连续的不可复制元素插入到std::vector中。我查看了insertemplace的签名,发现:

iterator insert( const_iterator pos, size_type count, const T& value );

但是由于T无法复制,因此这种过载无济于事。我还看到了:

template< class... Args > 
iterator emplace( const_iterator pos, Args&&... args );

emplace解决了不可复制的问题,但它每次只能插入一个元素。由于我想插入n元素,因此整体时间复杂度是二次O(n*size()),这是不可接受的。

是否有任何标准和便携式方法可以做到这一点?

如果要在vector末尾插入n默认构造元素,可以使用resize

std::vector<std::unique_ptr<int>> v;
v.resize(v.size() + 10);              // append 10 elements

如果要将它们插入其他位置,请使用接受一对迭代器的insert重载;在临时数组中构造元素并将它们移动到vector

std::unique_ptr<int> arr[10];
v.insert(v.begin(),
std::make_move_iterator(std::begin(arr)),
std::make_move_iterator(std::end(arr)));

现场演示

将它们放在保留后的末尾。 O(n+m( 表示 m 个新元素和 n 个现有元素。

将它们std::rotate到您想要的位置。 O(m+n-k(,其中k是你想要的向量中的位置。


或者,编写一个生成输入迭代器来生成相关元素。 然后使用template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last );重载。 这有更多的样板,但避免了一些移动。