2011-10-11 13 views
11

Prima C++11 Ho usato di swap-to-back per evitare spese generali copia completa, come:Utilizzando std :: spostare

vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(vector<Object>()); 
    Objects.back().swap(v); 
} 

Come posso usare std::move spostare v in Objects per evitare copia completa in testa, invece di swap?
So che ci sono un sacco di soluzioni alternative come array multipli o semplicemente inserendo direttamente in Objects.back(), ma ho bisogno di un esempio di utilizzo di std::move per capirlo.

+2

Perché si fa a creare 'V a tutti? Perché non aggiungere semplicemente un vettore vuoto in Oggetti e poi 'Objects.back(). Push_back()' in esso? Questo rimuove ancora più overhead mentre è più semplice. – Ayjay

+0

@Ayjay: leggi il resto della domanda – Dani

risposta

16
vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(std::move(v)); 
} 
+0

Ma questo lascia 'v' indietro. Ho capito che 'std :: move' dovrebbe essere alquanto distruttivo. – Dani

+2

@Dani: non dare per scontato. Provalo. In realtà, leggere anche il sorgente di 'vector :: vector (vector &&)' sarebbe abbastanza. La semantica è stranamente vicina alla versione 'std :: swap' - ma più elegante ed eventualmente più efficiente nel caso generale – sehe

+0

Decisamente più efficiente se il costruttore predefinito di' Object' non è banale. – ildjarn

17
Objects.push_back(std::move(v)); 
+2

+1 per avere la risposta corretta e ottenere molta meno attenzione – sehe

Problemi correlati