Qual è il modo migliore per concatenare due vettori?

Sto usando il multitreading e voglio unire i risultati. Per esempio:

std::vector A; std::vector B; std::vector AB; 

Voglio che AB abbia i contenuti di A e il contenuto di B in questo ordine. Qual è il modo più efficiente di fare qualcosa del genere?

 AB.reserve( A.size() + B.size() ); // preallocate memory AB.insert( AB.end(), A.begin(), A.end() ); AB.insert( AB.end(), B.begin(), B.end() ); 

Questo è esattamente ciò che la funzione membro std::vector::insert è per

 std::vector AB = A; AB.insert(AB.end(), B.begin(), B.end()); 

Dipende dalla necessità di concatenare fisicamente i due vettori o di dare l’aspetto della concatenazione a scopo di iterazione. La funzione boost :: join

http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html

ti darò questo

 std::vector v0; v0.push_back(1); v0.push_back(2); v0.push_back(3); std::vector v1; v1.push_back(4); v1.push_back(5); v1.push_back(6); ... BOOST_FOREACH(const int & i, boost::join(v0, v1)){ cout < < i << endl; } 

dovrebbe darti

 1 2 3 4 5 6 

Nota boost :: join non copia i due vettori in un nuovo contenitore ma genera una coppia di iteratori (intervallo) che coprono l'intervallo di entrambi i contenitori. Ci sarà un po 'di overhead delle prestazioni, ma forse meno che copi prima tutti i dati in un nuovo contenitore.

Basato sulla risposta di Kiril V. Lyadvinsky , ho fatto una nuova versione. Questo frammento usa template e sovraccarico. Con esso puoi scrivere vector3 = vector1 + vector2 e vector4 += vector3 . Spero che possa aiutare.

 template  std::vector operator+(const std::vector &A, const std::vector &B) { std::vector AB; AB.reserve( A.size() + B.size() ); // preallocate memory AB.insert( AB.end(), A.begin(), A.end() ); // add A; AB.insert( AB.end(), B.begin(), B.end() ); // add B; return AB; } template  std::vector &operator+=(std::vector &A, const std::vector &B) { A.reserve( A.size() + B.size() ); // preallocate memory without erase original data A.insert( A.end(), B.begin(), B.end() ); // add B; return A; // here A could be named AB } 

una variante più semplice che non è stata citata a getto:

 copy(A.begin(),A.end(),std::back_inserter(AB)); copy(B.begin(),B.end(),std::back_inserter(AB)); 

e usando l’algoritmo di fusione:


#include #include #include #include #include #include template

Se i vettori sono ordinati *, controlla set_union da .

 set_union(A.begin(), A.end(), B.begin(), B.end(), AB.begin()); 

C’è un esempio più approfondito nel link

* grazie rlbond

Tutte le soluzioni sono corrette, ma ho trovato più semplice scrivere una funzione per implementare questo. come questo:

 template  void ContainerInsert(T1 t1, T2 t2) { t1->insert(t1->end(), t2->begin(), t2->end()); } 

In questo modo puoi evitare il posizionamento temporaneo come questo:

 ContainerInsert(vec, GetSomeVector());