2012-10-12 18 views
14

Eventuali duplicati:
How to convert vector to array C++Il modo più veloce per copiare il contenuto di un vettore in un array?

Quando si lavora con gli array si avrà la possibilità di utilizzare

memcpy(void *destination, const void *source, size_t num); 

Tuttavia vettori forniscono semplicemente iteratori per un metodo di copia, rendendo memcpy inutile . Qual è il metodo più veloce per copiare il contenuto di un vettore in un'altra posizione?

+11

In C++, ** sempre ** usa 'std :: copy' piuttosto che' memcpy' (il primo delegherà a quest'ultimo quando po ssible). – ildjarn

+1

Non so quanto sia veloce, ma potresti usare 'std :: copy'. –

+1

Penso che la risposta più ovvia sarebbe: _Perché (pensi) devi copiare dal vettore in un array? _ Un vettore _è_ un array, e può essere usato come tale. Come effetto collaterale, "no copying affatto" è sicuramente l'operazione di copia più veloce possibile. – sbi

risposta

31

std::copy, giù le mani. È fortemente ottimizzato per utilizzare internamente il miglior metodo disponibile. È quindi completamente alla pari con memcpy. Non c'è motivo di utilizzare mai memcpy, anche quando si copia tra array di stile C o buffer di memoria.

3

È possibile utilizzare memcpy con un vettore - i vettori sono garantiti per essere contigui in memoria in modo a condizione che il vettore non è vuoto, è possibile utilizzare &vData[0] (dove vData è il vostro vettore) come il puntatore sorgente per memcpy

EDIT Come accennato dai commenti ad altre risposte, questo funziona solo se il valore value_type del vettore è banalmente riproducibile.

+2

-1 per lo stesso motivo indicato da ildjarn sotto la risposta di nosi. –

+1

@lidjarn OK abbastanza giustamente - non lo sapevo e sono sicuro che ci devono essere altri che non lo fanno troppo, quindi in realtà non cancellerò questa risposta. – mathematician1975

11

Dovrai misurarlo per te, nel tuo ambiente, con il tuo programma. Qualsiasi altra risposta avrà troppi avvertimenti.

Mentre lo fai, qui è uno metodo è possibile confrontare con:

std::copy(source.begin(), source.end(), destination); 
5

Prova questo: -

std::vector<int> newvector(oldvector); 

Per la copia in un array provare questo: -

std::copy(source.begin(), source.end(), destination); 
+2

-1. Asker vuole un array, non un nuovo vettore. –

+0

Scusa se ho letto male allora sarebbe fantastico come risposta Rob: - std :: copy (source.begin(), source.end(), destination); –

+0

Ho appena corretto. Grazie per aver detto !!! :) –

Problemi correlati