2012-03-19 19 views
25

Se ho due vettori e voglio combinarli a uno, posso farlo nel modo seguente:"MOVE" due vettori insieme

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)); 

che coinvolge la copia, però, che voglio evitare. C'è un modo per usare la semantica del movimento per riunirli?
Lo dubito fortemente, poiché uno vector dovrebbe essere contiguo. Tuttavia c'è un modo per farlo con un deque?

risposta

48

Sì, utilizzare std::move:

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

In alternativa, è possibile utilizzare gli iteratori Move:

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

Ricordarsi di #include <iterator> in entrambi i casi, e prima di iniziare, dire:

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

A seconda del costo dell'inizializzazione del valore rispetto al controllo e all'incremento il contatore delle dimensioni, la seguente variante può essere anche interessante:

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

Grazie, ora so perché ci sono due versioni di 'std :: move' su cppreference. Ho sempre pensato che fosse un bug e non ho controllato la seconda versione. – inf

+3

Mi ero completamente perso il fatto che 'move' era anche un algoritmo. – bames53

+0

@ bames53 lo stesso è successo a me, ma dopo averlo ascoltato, ha senso perché c'è anche "copia". – inf

7

Dipende esattamente da ciò che si desidera spostare. Quando si sposta un vettore, lo si fa scambiando efficacemente il puntatore dell'array interno. Quindi puoi fare un punto vettoriale sull'array precedentemente posseduto da un altro vettore.

Ma questo non ti consente di unire due vettori.

Il meglio che puoi fare è quindi di spostare ogni elemento singolo membro, come indicato nella risposta di Kerrek:

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

Di nuovo, questo scorrere il vettore e spostare ogni elemento al vettore di destinazione.

+0

Una domanda, che differenza fa però? Non stiamo essenzialmente copiando gli oggetti in a nelle posizioni in b? Non farà la stessa cosa di inserire come nella domanda dell'op? – nnrales

+0

Suppongo che se gli oggetti in a sono complessi, allora i loro agenti di copia non verranno chiamati, solo una copia di memoria? – nnrales