Il y a eu de nombreuses réponses ici et à peu près toutes feront le travail.
Cependant, il y a quelques conseils trompeurs!
Voici les options:
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());
}
Pour faire court, la méthode 4, en utilisant vector :: insert, est la meilleure pour le scénario de bsruth.
Voici quelques détails sanglants:
La méthode 1 est probablement la plus simple à comprendre. Copiez simplement chaque élément du tableau et poussez-le à l'arrière du vecteur. Hélas, c'est lent. Puisqu'il y a une boucle (implicite avec la fonction de copie), chaque élément doit être traité individuellement; aucune amélioration des performances ne peut être apportée sur la base du fait que nous savons que le tableau et les vecteurs sont des blocs contigus.
La méthode 2 est une amélioration des performances suggérée par rapport à la méthode 1; juste pré-réserver la taille du tableau avant de l'ajouter. Pour les grands tableaux, cela peut aider. Cependant, le meilleur conseil ici est de ne jamais utiliser la réserve à moins que le profilage ne suggère que vous puissiez obtenir une amélioration (ou vous devez vous assurer que vos itérateurs ne seront pas invalides). Bjarne est d'accord . Incidemment, j'ai trouvé que cette méthode était la plus lente la plupart du temps, même si j'ai du mal à expliquer en détail pourquoi elle était régulièrement beaucoup plus lente que la méthode 1 ...
La méthode 3 est la solution à l'ancienne - jetez un peu de C sur le problème! Fonctionne très bien et rapidement pour les types POD. Dans ce cas, le redimensionnement doit être appelé car memcpy fonctionne en dehors des limites du vecteur et il n'y a aucun moyen de dire à un vecteur que sa taille a changé. En plus d'être une solution moche (copie d'octets!), Rappelez-vous que cela ne peut être utilisé que pour les types POD . Je n'utiliserais jamais cette solution.
La méthode 4 est la meilleure solution. Sa signification est claire, c'est (généralement) le plus rapide et cela fonctionne pour tous les objets. Il n'y a aucun inconvénient à utiliser cette méthode pour cette application.
La méthode 5 est une modification de la méthode 4 - copiez le tableau dans un vecteur, puis ajoutez-le. Bonne option - généralement rapide et claire.
Enfin, vous savez que vous pouvez utiliser des vecteurs à la place des tableaux, non? Même lorsqu'une fonction attend des tableaux de style C, vous pouvez utiliser des vecteurs:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
J'espère que cela aide quelqu'un là-bas!