除了
François Andrieux 的回答,
std::vector
还有一个可迭代的
insert()
成员函数。直接传递您的
unique_ptr
向量的迭代器是行不通的,但有一种方法可以将这些迭代器的反引用从左值转换为X值:
std::move_iterator
和相应的工厂函数:
std::make_move_iterator
:
sharedV.insert(sharedV.end(),
std::make_move_iterator(uniqueV.begin()),
std::make_move_iterator(uniqueV.end()));
使用insert()
可能比使用std::back_inserter
更有效的原因是,insert()
在前期就知道结果的大小,所以最多只需要进行一次分配,然后在执行插入操作时无需进行大小检查。
为了解决这个问题,建议使用名为extend()
的基于范围的重载函数。
template <class T, class Range>
void extend(std::vector<T>& dst, Range&& range) {
using std::begin; using std::end;
if constexpr (std::is_lvalue_reference<Range>{}) {
dst.insert(dst.end(), begin(range), end(range));
} else {
dst.insert(dst.end(),
std::move_iterator(begin(range)), std::move_iterator(end(range)));
}
}
这是 C++17 的语法,但在 C++14 中也可以轻松实现。只是需要打更多的字。你可以这样编写代码:
extend(sharedV, std::move(uniqueV))