2010-04-05 7 views
5

ho il seguente codice per assegnare un valore a tutti gli elementi di un vettore:for_each ma per impostare ogni elemento per un valore in C++

x = 100; 

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

E 'abbastanza semplice, ma mi chiedo se non v'è una funzione in STL che fa la stessa cosa; qualcosa come for_each, ma per l'assegnazione.

+0

Personalmente, ho sempre preferito "BOOST_FOREACH', con cui è possibile eseguire' BOOST_FOREACH (int & i, vect) {i = x; } ' –

risposta

10

Uso std::fill:

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

Nota se si desidera inizializzare un vettore di avere tutte lo stesso valore, è possibile utilizzare la funzione di costruzione appropriata:

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

assign può essere utilizzato per "resettare il vettore", ma se stai facendo il vettore, usa il costruttore.

+1

Se vuoi riempire un vettore esistente con meno elementi di quelli già presenti e ritagliare il resto per risparmiare spazio, usa l'idioma dello swap:' vector (3,25) .swap (v); ' – wilhelmtell

+0

^^. .. lo swap idiom attiverà una riallocazione, dovrei menzionare, ma si tradurrà in meno memoria utilizzata per il vettore. Quindi alla fine è una buona idea solo se la tua intenzione è di ridurre l'uso della memoria, non di riempire un vettore con (casualmente meno valori). – wilhelmtell

7
vect.assign(n, x); 

n numero di elementi.

x è il valore da compilare.

La differenza da std::fill è che viene fornita la lunghezza per questo. std::fill userebbe la lunghezza precedente del vettore. (In realtà, userebbe qualsiasi segmento del vettore a cui lo dici, ma usando vect.begin() e vect.end() come nell'esempio precedente userebbe la lunghezza precedente.) A seconda della situazione, vorrai usare l'una o l'altra.

+0

L'altra differenza è che 'assign()' è un membro di 'vector' mentre' fill() 'fa parte della libreria di algoritmi più generica che funziona con qualsiasi iteratore in avanti (o un iteratore di output se si utilizza una firma diversa) . Penso che ci si possa ragionevolmente aspettare che 'vector :: assign()' funzioni meglio di 'std :: fill()'. –

+0

@ Michael: Probabilmente. Il motivo per cui ho scelto 'fill' era perché corrisponde al codice nella domanda, anche se suppongo che si possa fare' vect.assign (vect.size(), x); '. Inoltre, 'std :: fill' potrebbe essere specializzato per gli iteratori ad accesso casuale, ottenendo lo stesso risultato in termini di prestazioni. – GManNickG

+0

@Michael e GMan: dubito che la maggior parte delle librerie standard ottimizzi abbastanza per fare la differenza in velocità (anche se 'assign' ha il potenziale per essere più veloce perché potrebbe potenzialmente usare SIMD, che non penso possa riempire , a meno che il compilatore non sia davvero intelligente). Penso che vorreste evitare 'vect.assign (vect.size(), x)' perché potrebbe riallocare l'array interno, a seconda dell'implementazione. Il motivo per cui ho scelto 'assign' era perché è la funzione che uso di più, insieme al costruttore, che è molto simile. 'fill' probabilmente ha più senso in questo caso. – Zifre

Problemi correlati