2010-04-05 15 views
5

tengo el siguiente código para asignar un valor a todos los elementos de un vector:for_each pero para ajustar cada elemento en un valor en C++

x = 100; 

for (int i=0;i<vect.size();i++) 
{ 
    vect[i] = x; 
} 

Es bastante sencillo, pero me pregunto si hay una función en el STL que hace lo mismo; algo como for_each, pero para asignación.

+0

Personalmente, siempre he preferido 'BOOST_FOREACH', con lo cual puedes hacer' BOOST_FOREACH (int & i, vect) {i = x; } ' –

Respuesta

10

Uso std::fill:

std::fill(vect.begin(), vect.end(), 100); 

Nota si desea inicializar un vector de tener todas el mismo valor, puede utilizar el constructor apropiado:

std::vector<int> v(5, 100); // 5 elements set to 100 

assign se puede utilizar para "restablecer el vector", pero si solo está creando el vector, use el constructor.

+1

Si desea llenar un vector existente con menos elementos de los que ya tiene y recortar el resto para ahorrar espacio, utilice la expresión de intercambio:' vector (3,25) .swap (v); ' – wilhelmtell

+0

^^. .. la expresión de intercambio provocará una reasignación, debo mencionar, pero dará como resultado que se use menos memoria para el vector. Por lo tanto, en última instancia, es una buena idea solo si su intención es reducir el uso de memoria, no para llenar un vector con (por coincidencia, menos) valores. – wilhelmtell

7
vect.assign(n, x); 

n es el número de elementos.

x es el valor que debe completar.

La diferencia de std::fill es que proporciona la longitud para esto. std::fill usaría la longitud anterior del vector. (En realidad, usaría cualquier segmento del vector que le indique, pero usando vect.begin() y vect.end() como en el ejemplo anterior usaría la longitud anterior.) Dependiendo de la situación, querrá usar uno u otro.

+0

La otra diferencia es que 'assign()' es un miembro de 'vector', mientras que' fill() 'es parte de la biblioteca de algoritmos más genérica que funciona con cualquier iterador directo (o un iterador de salida si usa una firma diferente) . Creo que podría esperarse razonablemente que 'vector :: assign()' funcione mejor que 'std :: fill()'. –

+0

@Michael: Probablemente. La razón por la que elegí 'fill' fue porque coincide con el código en la pregunta, aunque podría decirse que se podría hacer' vect.assign (vect.size(), x); '. Por otra parte, 'std :: fill' podría especializarse para iteradores de acceso aleatorio, produciendo el mismo resultado en términos de rendimiento. – GManNickG

+0

@Michael y GMan: dudo que la mayoría de las bibliotecas estándar optimicen lo suficiente como para hacer una diferencia en la velocidad (aunque 'assign' tiene el potencial de ser más rápido porque podría usar SIMD, que no creo que' fill' pudiera , a menos que el compilador sea realmente inteligente). Creo que desearía evitar 'vect.assign (vect.size(), x)' porque podría reasignar la matriz interna, dependiendo de la implementación. La razón por la que elegí 'assign' fue porque es la función que uso más, junto con el constructor, que es muy similar. 'fill' probablemente tenga más sentido en este caso. – Zifre

Cuestiones relacionadas