2010-08-16 30 views
5

Decir que tengo el siguiente:¿Puede un std :: vector ser = 'd a otro std :: vector?

std::vector<int> myints; 

y luego tengo una función que devuelve un vector int:

std::vector<int> GiveNumbers() 
{ 
    std::vector<int> numbers; 
for(int i = 0; i < 50; ++i) 
{ 
    numbers.push_back(i); 
} 

return numbers; 
} 

podría yo entonces hacer:

myints = GiveNumbers(); 

podría hacer esto de manera segura haz que Myints tenga los números del 0 al 49 y nada más. ¿Hacía esto claro lo que podría haber sido en myints anteriormente? Si no, ¿cuál es la forma correcta de hacer esto?

Gracias

Respuesta

7

Sí. Esto es seguro. Copiará los resultados de su función GiveNumbers() en myints. Puede que no sea la forma más eficiente de hacerlo, pero es seguro y correcto. Para vectores pequeños, las diferencias de eficiencia no serán tan buenas.

+1

+1 para advertencias sobre la eficiencia. – Brian

+2

No debería ser ineficiente si su compilador admite RVO. – jamesdlin

+1

RVO solo debe reducir la copia de twic4e para copiar una vez. –

1

Sí, se le asignará y se borrará lo que había en el vector de recepción previamente.

1

Sí, de hecho, su return numbers en GiveNumbers() está copiando el vector en la pila.

Cuando se utiliza la operator=, obtendrá el mismo contenido en su nuevo vector

+0

¡Perfecto, gracias! – jmasterx

+0

He votado de nuevo por un muy buen comentario. Probablemente no invoque op = en la vida real debido a las optimizaciones – pm100

1

Como se ha mencionado, esto es perfectamente seguro de usar, aunque no es el método más eficiente para hacerlo.

Para ahorrar en recursos, puede ser mejor pasar su vector por referencia y modificarlo directamente.

void setNumbers(vector<int> &nums) 
{ 
    nums.resize(50); 
    for(int i = 0; i < 50; ++i) 
    { 
     nums[i] = i; 
    } 
} 

Como también se ha mencionado, la eficiencia no puede hacer una gran diferencia para los vectores muy pequeñas, pero en realidad los vectores más grandes pueden ser sustanciales.

El ahorro que obtiene modificando el vector original directamente son de dos maneras:

  1. ahorro de memoria (no crear un vector temporal)
  2. ahorro velocidad (Sólo la iteración N veces para establecer el vector en una pase, en lugar de tomar un pase para establecer el vector temporal y un segundo pase para copiarlos en el original)
+0

No debería ser ineficiente si su compilador admite RVO, que hace esa transformación por usted. – jamesdlin

+0

Además, su versión que toma un argumento de referencia debe tener cuidado de llamar primero a 'std :: vector :: clear() 'o verificar que el argumento entrante no comience con más de 50 elementos. – jamesdlin

+0

@jamesdlin: tenga en cuenta el uso de 'nums.resize (50);'. – KevenK