2012-03-19 18 views
25

如果我有兩個向量,並希望將它們組合到一個,我能做到這一點的方式如下:「動」兩種載體一起

std::vector<T> a(100); // just some random size here 
std::vector<T> b(100); 

a.insert(std::end(a), std::begin(b), std::end(b)); 

這涉及到複製,雖然,這是我想避免的。有什麼方法可以使用移動語義來將它們組合在一起?
我非常懷疑它,因爲vector應該是連續的。但是有什麼辦法可以通過deque來完成嗎?

回答

48

是,使用std::move

#include <algorithm> 
std::move(b.begin(), b.end(), std::back_inserter(a)); 

或者,您可以使用移動迭代器:

a.insert(a.end(), 
     std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); 

記住要在這兩種情況下#include <iterator>,並開始之前,說:

a.reserve(a.size() + b.size()); 

取決於與檢查和增量相比的值初始化的成本大小計數器,下面的變體也可能是有趣的:

std::size_t n = a.size(); 
a.resize(a.size() + b.size()); 
std::move(b.begin(), b.end(), a.begin() + n); 
+0

謝謝,現在我知道爲什麼在cppreference上有兩個版本的'std :: move'。我一直認爲這是一個錯誤,並沒有檢查第二個版本。 – inf 2012-03-19 21:55:48

+3

我完全錯過了「移動」也是一種算法。 – bames53 2012-03-19 21:59:14

+0

@ bames53同樣發生在我身上,但在聽完之後,它總是有意義的,因爲還有'copy'。 – inf 2012-03-19 22:01:28

7

取決於你想要移動。移動矢量時,通過有效交換內部數組指針來完成。所以你可以使一個向量指向先前由另一個向量所擁有的數組。

但是,這不會讓你合併兩個向量。

你能做到的話,最好是每一個人成員元素移動,如圖Kerrek的回答是:

std::move(b.begin(), b.end(), std::back_inserter(a)); 

同樣,這將通過矢量迭代和每一個元素移動到目標向量。

+0

一個問題,它有什麼不同?我們是不是基本上將a中的物體複製到b的位置?它不會像插入問題那樣插入相同的東西嗎? – nnrales 2016-11-29 00:21:24

+0

我想如果a中的對象很複雜,那麼它們的拷貝不會被調用,只是一個內存拷貝? – nnrales 2016-11-29 00:22:31

相關問題