2010-04-05 7 views
5

je le code suivant pour attribuer une valeur à tous les éléments d'un vecteur:for_each mais pour le réglage de chaque élément à une valeur en C++

x = 100; 

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

Il est assez simple, mais je me demande s'il y a une fonction dans la STL qui fait la même chose; quelque chose comme for_each, mais pour l'affectation.

+0

Personnellement, j'ai toujours préféré 'BOOST_FOREACH', avec lequel vous pouvez faire' BOOST_FOREACH (int & i, vect) {i = x; } ' –

Répondre

10

Utilisation std::fill:

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

Remarque si vous souhaitez initialiser un vecteur d'avoir tous la même valeur, vous pouvez utiliser le constructeur approprié:

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

assign peut être utilisé pour "réinitialiser le vecteur", mais si vous ne faites que le vecteur, utilisez le constructeur.

+1

Si vous souhaitez remplir un vecteur existant avec moins d'éléments qu'il n'en a déjà et couper le reste pour économiser de l'espace, utilisez l'idiome swap:' vector (3,25) .swap (v); ' – wilhelmtell

+0

^^. .. l'idiome de swap déclenchera une réallocation, je devrais mentionner, mais résultera en moins de mémoire utilisée pour le vecteur. Donc finalement c'est une bonne idée seulement si votre intention est de réduire l'utilisation de la mémoire, pas de remplir un vecteur avec (par hasard moins de valeurs). – wilhelmtell

7
vect.assign(n, x); 

n est le nombre d'éléments.

x est la valeur à renseigner.

La différence par rapport à std::fill est que vous fournissez la longueur pour cela. std::fill utiliserait la longueur précédente du vecteur. (En fait, il utiliserait n'importe quel segment du vecteur auquel vous le dites, mais en utilisant vect.begin() et vect.end() comme dans l'exemple ci-dessus utiliserait la longueur précédente.) Selon la situation, vous voudrez utiliser l'un ou l'autre.

+0

L'autre différence est que 'assign()' est un membre de 'vector' tandis que' fill() 'fait partie de la bibliothèque d'algorithmes plus générique qui fonctionne avec n'importe quel itérateur avant (ou un itérateur de sortie si vous utilisez une signature différente) . Je pense que l'on pourrait raisonnablement s'attendre à ce que 'vector :: assign()' fonctionne mieux que 'std :: fill()'. –

+0

@Michael: Probablement. La raison pour laquelle j'ai choisi 'fill' était parce qu'elle correspond au code dans la question, même si je suppose que l'on pourrait faire' vect.assign (vect.size(), x); '. Là encore, 'std :: fill' pourrait être spécialisé pour les itérateurs à accès aléatoire, donnant le même résultat en termes de performances. – GManNickG

+0

@Michael et GMan: Je doute que la plupart des bibliothèques standard optimisent suffisamment pour que cela fasse une différence de vitesse (même si 'assign' a le potentiel d'être plus rapide car il pourrait potentiellement utiliser SIMD, ce que je ne pense pas 'remplir' pourrait , sauf si le compilateur est vraiment intelligent). Je pense que vous voudriez éviter 'vect.assign (vect.size(), x)' parce qu'il pourrait réallouer le tableau interne, en fonction de l'implémentation. La raison pour laquelle j'ai choisi 'assign' était parce que c'est la fonction que j'utilise le plus, avec le constructeur, qui est très similaire. "remplir" a probablement plus de sens dans ce cas. – Zifre