如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
How to insert n contiguous elements into a std::vector whose element type is non-copyable?
我想将n
连续的不可复制元素插入到std::vector
中。我查看了insert
和emplace
的签名,发现:
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 );
重载。 这有更多的样板,但避免了一些移动。
相关文章:
- 简单可复制与可简单复制
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么一对常量是微不足道的可复制的,而对不是?
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 防止作用域枚举可复制/可移动
- C :对象上的可复制视图
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 为什么 std::function 本身是可复制构造的类型?
- C2280 STD :: vector的默认构造函数尽管具有移动构造函数,但仍需要元素的复制构造函数
- C++不可复制的 lambda 的行为是可复制的
- 错误:无法通过'...'传递非平凡可复制类型的对象'class boost::filesystem::path'
- 不能让类是微不足道的可复制的。我做错了什么?
- 如何将一个向量的元素引用复制到另一个向量?
- 使用临时存储区复制普通的可复制类型:允许吗
- 为什么向量中的元素需要是可复制的