Ha habido muchas respuestas aquí y casi todas harán el trabajo.
Sin embargo, ¡hay algunos consejos engañosos!
Estas son las opciones:
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());
}
Para abreviar una historia larga, el Método 4, usar vector :: insert, es el mejor para el escenario de bsruth.
Aquí hay algunos detalles sangrientos:
Método 1 es probablemente el más fácil de entender. Simplemente copie cada elemento de la matriz y empújelo en la parte posterior del vector. Por desgracia, es lento. Debido a que hay un bucle (implícito con la función de copia), cada elemento debe tratarse individualmente; no se pueden realizar mejoras de rendimiento basadas en el hecho de que sabemos que la matriz y los vectores son bloques contiguos.
El método 2 es una mejora de rendimiento sugerida para el método 1; simplemente reserve previamente el tamaño de la matriz antes de agregarla. Para arreglos grandes, esto podría ayudar. Sin embargo, el mejor consejo aquí es que nunca use la reserva a menos que el perfil sugiera que puede obtener una mejora (o debe asegurarse de que sus iteradores no se invaliden). Bjarne está de acuerdo . Por cierto, descubrí que este método funcionaba más lento la mayor parte del tiempo, aunque estoy luchando por explicar de manera integral por qué era regularmente significativamente más lento que el método 1 ...
El método 3 es la solución de la vieja escuela: ¡arroje algo de C al problema! Funciona bien y rápido para tipos POD. En este caso, es necesario llamar a resize ya que memcpy funciona fuera de los límites del vector y no hay forma de decirle a un vector que su tamaño ha cambiado. Además de ser una solución desagradable (¡copia de bytes!), Recuerde que esto solo se puede usar para tipos POD . Nunca usaría esta solución.
El método 4 es la mejor manera de hacerlo. Su significado es claro, es (generalmente) el más rápido y funciona para cualquier objeto. No hay inconveniente en utilizar este método para esta aplicación.
Método 5 es una modificación del Método 4: copia la matriz en un vector y luego agrégala. Buena opción, generalmente rápida y clara.
Finalmente, sabe que puede usar vectores en lugar de matrices, ¿verdad? Incluso cuando una función espera matrices de estilo c, puede usar vectores:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
¡Espero que eso ayude a alguien!