indica che ho uno vector
di pair<int,int>
. Ora voglio estrarre il pair.first
e il pair.second
come vettori indipendenti. Posso scorrere il vettore e farlo ma c'è un modo migliore/più veloce?Il modo più veloce per convertire da vettore di coppie a due vettori indipendenti in C++
risposta
in C++ 11, se non avete bisogno di più il vecchio vettore, si potrebbe forse ottenere un po 'di efficienza in più da semantica move:
for (auto it = std::make_move_iterator(v.begin()),
end = std::make_move_iterator(v.end()); it != end; ++it)
{
v1.push_back(std::move(it->first));
v2.push_back(std::move(it->second));
}
Oltre a questo, non si può certo fare meglio di un ciclo. Dovrai toccare ogni elemento almeno una volta, quindi è più efficiente che mai.
Si noti che lo spostamento può solo fare la differenza se i tipi di elementi stessi hanno semantica di movimento che è meglio della copia. Questo non è il caso di int
s o di qualsiasi POD. Ma non può fare male scrivere il tuo codice genericamente in modo da poterlo sfruttare in situazioni future.
Se la copia/spostamento è un problema, tuttavia, è necessario considerare se un adattatore vista per il vettore originale potrebbe essere un approccio migliore.
Whoa, non ho mai saputo di "make_move_iterator', +1 –
@SethCarnegie: In realtà dubito che sia necessario qui; L'ho appena messo per divertimento (lo 'std :: move' dovrebbe già fare il trucco). L'iteratore di spostamento è molto utile per gli algoritmi, però. Viene pre-incartato in ['algorithm/std :: move'] (http://en.cppreference.com/w/cpp/algorithm/move), che è la versione mobile di' std :: copy'. –
@KerrekSB: E quale sarebbe l'* extra efficiency * proveniente? Non penso che questo sarà più efficiente del più semplice anello idiomatico - il che è anche più facile da ragionare. –
No, non c'è. L'unica cosa di cui preoccuparsi è usare reserve
sui due vettori risultanti per evitare riallocazioni non necessarie.
Devi comunque ripetere sul vettore, quindi in termini di complessità, questo è il massimo che puoi ottenere.
Non è possibile evitare l'iterazione. Per quanto riguarda la soluzione più veloce, dipende da cosa è nella coppia e dall'attuazione effettiva. In base a questi, potrebbe essere meglio creare i vettori di destinazione con la dimensione corretta e assegnarli a ; o per crearli vuoti e utilizzare reserve
e quindi push_back
. Si potrebbe anche voler confrontare l'indicizzazione con gli iteratori; se si utilizzano vettori di dimensioni preimpostate, l'utilizzo di una sola variabile di controllo anziché di tre potrebbe essere un miglioramento. (Con g ++, l'ultima volta ho misurato, creando vettori di dimensioni corrette e assegnazione era più veloce rispetto all'utilizzo reserve
e push_back
, almeno per double
. Nonostante il fatto che significava loop due volte internamente e inizializzazione dei valori di 0.0
.)
si potrebbe anche voler provare a creare oggetti funzionali per estrarre i primo e il secondo elemento della coppia (supponendo non si dispone già di loro ), e utilizzare due chiamate per transform
. Di nuovo, con un vettore predimensionato o usando un inseritore posteriore come obiettivo. A parte, I non si aspettava che questo fornisse prestazioni migliori, ma non si sa mai.
- 1. Il modo più veloce di cross-tabulare due vettori logici enormi in R
- 2. Il modo più veloce per copiare il contenuto di un vettore in un array?
- 3. C++ vettore di vettori
- 4. Il modo più efficace per sostituire i vettori
- 5. Il modo più veloce per convertire T [,] in T [] []?
- 6. Il modo più veloce per convertire stringhe in binario?
- 7. C++ vettore di inizializzazione coppie
- 8. Come posso ottenere caratteri comuni a due vettori in C++?
- 9. Funzione R per fare tutti i confronti a coppie per due vettori
- 10. Il modo più veloce per convertire chiavi e valori di dict da `unicode` a` str`?
- 11. Il modo più semplice per convertire "a/b/c" in ["a/b/c", "a/b", "a"]
- 12. Il modo più veloce per convertire un'immagine a 12 bit in un'immagine a 16 bit
- 13. Il modo più veloce per comunicare tra C++ e C#
- 14. Il modo più veloce per creare file in C#
- 15. C++, il modo più veloce per cancellare o cancellare un vettore
- 16. Un modo più veloce di trasformare il vettore di testo in matrice numerica/data.frame in R?
- 17. Trovare combinazioni di parole in due vettori
- 18. Il modo più veloce per convertire il carattere numerico in R
- 19. Trova modo più veloce per ottenere tutti gli intervalli tra elementi identici in un vettore
- 20. Qual è il modo più veloce per ottenere frequenze di numeri interi in un vettore?
- 21. aggiungendo due vettori da nomi
- 22. Il modo più veloce per invertire una stringa in C
- 23. vettore di vettori push_back
- 24. Ripristina array C int a zero: il modo più veloce?
- 25. Il modo più veloce per convertire un intero in array di byte arbitrariamente ordinati in JavaScript?
- 26. Modo efficiente per campionare da diversi vettori di probabilità
- 27. Iniezione a più componenti indipendenti
- 28. Il modo più veloce per convertire chiavi e valori di dict da `bytes` a` str` in python3
- 29. Il modo più veloce per rimuovere un numero enorme di elementi da una matrice in C
- 30. Il modo più veloce per creare gif animate da mp4
Non vedo alcun modo di renderlo più veloce del loop su tutti gli elementi nel vettore. Tuttavia, non devi fare il loop, usa qualcosa come ['std :: for_each'] (http://en.cppreference.com/w/cpp/algorithm/for_each). –
Sei sicuro di aver bisogno di copiare i valori in nuovi vettori? Forse potresti usare [transform_iterators] (http://www.boost.org/doc/libs/release/libs/iterator/doc/transform_iterator.html) per iterare semplicemente sul vettore originale mentre ottieni gli elementi di coppia, senza copiarli altrove. –
si. ma non volevo usare boost. Ad ogni modo, tutti hanno dato la risposta corretta, quindi accetterò la risposta con i migliori "dettagli". – Neal