C ++ convierte vector <int> en vector <doble>


93

¿Cuál es una buena forma limpia de convertir un archivo std::vector<int> intVeca std::vector<double> doubleVec. ¿O, más generalmente, convertir dos vectores de tipos convertibles?

Respuestas:


164

Utilice std::vectorel constructor de rango:

std::vector<int> intVec;
std::vector<double> doubleVec(intVec.begin(), intVec.end());

Entonces, ¿también podrías usar la std::copy(...)función? ¿Podría agregar eso a la respuesta?
Alan Turing

3
@Lex:, copy(v_int.begin(), v_int.end(), back_inserter(v_float));ov_float.resize(v_int.size()); copy(v_int.begin(), v_int.end(), v_float.begin());
Jon Purdy

1
mala idea, porque la versión del constructor ajustará el tamaño del vector usando la categoría de iterador para notar que esos son iteradores de acceso aleatorio y luego reservará suficiente espacio. Cambiar el tamaño antes de copiar es una inicialización cero inútil.
Michael Goldshteyn

1
@MichaelGoldshteyn No entiendo: si no especifica el tamaño de antemano, se cambiará de tamaño automáticamente cada vez que se exceda la capacidad (lo que copia todos los elementos una y otra vez). Bien, esto es tiempo lineal amortizado, pero apuesto a que sigue siendo mucho más lento que una sola inicialización 0. ¿Me estoy perdiendo algo de tu argumento?
Algoman

1
@Algoman ver std::distance()"Si es un iterador de acceso aleatorio, la función usa el operador- para calcular esto. De lo contrario, la función usa el operador de aumento (operador ++) repetidamente". Entonces, en este caso, la cantidad de elementos se podría encontrar restando los iteradores. Si la biblioteca estándar está implementada para usar std :: distance para una reserva inicial () es otra cuestión, pero godbolt.org/z/6mcUFh al menos contiene una llamada a std :: distance ().
user1556435
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.