要添加上的François Andrieux's answer頂部,std::vector
具有介於insert()
成員函數。正好路過的迭代器到你的unique_ptr
載體將無法正常工作,但有一種方法對那些迭代器反引用轉換從左值到xvalues:std::move_iterator
及其對應的工廠函數:std::make_move_iterator
:
sharedV.insert(sharedV.end(),
std::make_move_iterator(uniqueV.begin()),
std::make_move_iterator(uniqueV.end()));
的原因,這可能比使用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));
*所以這將是可取的使用std :: shared_ptr代替*這些事情需要參與所有權嗎?如果沒有,你可以通過引用傳遞向量。 – NathanOliver
@NathanOliver對於某些我們希望共享這些指針所有權的特定情況,我們期望這樣做。不要過分:) – Amadeusz