Ci sono state molte risposte qui e quasi tutte porteranno a termine il lavoro.
Tuttavia c'è qualche consiglio fuorviante!
Ecco le opzioni:
vector<int> dataVec;
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
// Method 1: Copy the array to the vector using back_inserter.
{
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
dataVec.reserve(dataVec.size() + dataArraySize);
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 3: Memcpy
{
dataVec.resize(dataVec.size() + dataArraySize);
memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}
// Method 4: vector::insert
{
dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}
// Method 5: vector + vector
{
vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}
Per farla breve, il Metodo 4, usando vector :: insert, è il migliore per lo scenario di bsruth.
Ecco alcuni dettagli cruenti:
Il metodo 1 è probabilmente il più facile da capire. Basta copiare ogni elemento dall'array e inserirlo nella parte posteriore del vettore. Ahimè, è lento. Poiché esiste un ciclo (implicito con la funzione di copia), ogni elemento deve essere trattato individualmente; non è possibile apportare miglioramenti alle prestazioni in base al fatto che sappiamo che la matrice e i vettori sono blocchi contigui.
Il metodo 2 è un miglioramento delle prestazioni suggerito per il metodo 1; è sufficiente prenotare in anticipo la dimensione dell'array prima di aggiungerlo. Per array di grandi dimensioni questo potrebbe aiutare. Tuttavia, il miglior consiglio qui è di non usare mai la riserva a meno che la profilazione non suggerisca che potresti essere in grado di ottenere un miglioramento (o devi assicurarti che i tuoi iteratori non vengano invalidati). Bjarne è d'accordo . Per inciso, ho scoperto che questo metodo è stato il più lento per la maggior parte del tempo, anche se sto lottando per spiegare in modo completo perché era regolarmente significativamente più lento del metodo 1 ...
Il metodo 3 è la soluzione vecchia scuola: lancia un po 'di C al problema! Funziona bene e velocemente per i tipi di POD. In questo caso è necessario chiamare resize poiché memcpy funziona al di fuori dei limiti del vettore e non c'è modo di dire a un vettore che la sua dimensione è cambiata. Oltre ad essere una brutta soluzione (copia dei byte!), Ricorda che può essere usata solo per i tipi POD . Non userei mai questa soluzione.
Il metodo 4 è il modo migliore per procedere. Il suo significato è chiaro, è (di solito) il più veloce e funziona per qualsiasi oggetto. Non ci sono svantaggi nell'utilizzo di questo metodo per questa applicazione.
Il metodo 5 è un tweak sul metodo 4: copia l'array in un vettore e poi aggiungilo. Buona opzione - generalmente veloce e chiara.
Infine, sei consapevole che puoi usare i vettori al posto degli array, giusto? Anche quando una funzione si aspetta array in stile c puoi usare i vettori:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Spero che aiuti qualcuno là fuori!