120 votes

utiliser std::fill pour remplir le vecteur avec des nombres croissants

Je voudrais remplir un vector<int> en utilisant std::fill mais au lieu d'une valeur, le vecteur doit contenir des nombres en ordre croissant après.

J'ai essayé d'y parvenir en itérant le troisième paramètre de la fonction par un, mais cela ne me donnait que des vecteurs remplis de 1 ou de 2 (en fonction de la position de l'argument de la fonction). ++ opérateur).

Ejemplo:

vector<int> ivec;
int i = 0;
std::fill(ivec.begin(), ivec.end(), i++); // elements are set to 1
std::fill(ivec.begin(), ivec.end(), ++i); // elements are set to 2

0voto

winvicta Points 11

Brainsandwich et underscore_d ont donné de très bonnes idées. Puisque remplir, c'est changer le contenu, for_each(), le plus simple des algorithmes STL, devrait également faire l'affaire :

std::vector<int> v(10);
std::for_each(v.begin(), v.end(), [i=0] (int& x) mutable {x = i++;});    

La capture généralisée [i=o] confère à l'expression lambda un invariant et l'initialise à un état connu (dans ce cas 0). le mot clé mutable permet à cet état d'être mis à jour à chaque fois que lambda est appelé.

Il suffit d'une légère modification pour obtenir une séquence de carrés :

std::vector<int> v(10);
std::for_each(v.begin(), v.end(), [i=0] (int& x) mutable {x = i*i; i++;});

Générer des seq de type R n'est pas plus difficile, mais notez que dans R, le mode numérique est en fait double, donc il n'y a pas vraiment besoin de paramétrer le type. Utilisez simplement double.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X