
Envoy� par
salseropom
Bonjour, j'ai le code suivant
1 2 3 4 5
|
vector<double> v(4);
for(int i = 0 ; i < 4 ; i++)
v[i] = i; |
Est-il possible d'utiliser une fonction de la STL pour ne pas avoir � �crire cette boucle for ?
Sur STLPort, il y a une fonction iota() qui fait exactement �a (elle tire son nom d'une fonction APL). Tu �criras
iota(v.begin(), v.end(), 0);
(le z�ro dans l'appel est la base, la premi�re valeur de la suite, affect�e � v[0])
Elle n'existe malheureusement pas chez Dinkumware, mais tu peux la red�finir en utilisant generate() et un foncteur qui g�re l'�num�ration.
Par exemple, pour g�n�rer des suites affines,
1 2 3 4 5 6 7 8 9
| struct LinGen {
int val;
int pas;
lingen(int b=0,int p=1) val(b),pas(p){}
int operator()() {
int v=val;
val+=pas;
return v;}
}; |
Ca s'appelle avec
1 2 3
|
vector<int> v(12);
generate(v.begin(),v.end(),LinGen(0,1)); |
Le premier param�tre du constructeur est la base, le second le pas (la diff�rence entre deux valeurs successives)
LinGen(0,1) g�n�re 0 1 2 3 4 ...
LinGen(1,2) g�n�re 1 3 5 7 9 ...
LinGen(30,-2) g�n�re 30 28 26 24 22 ...
et ainsi de suite. Et bien sur, ca se g�n�ralise � des suites plus complexes, ou des flottants...
Ce n'est pas tout � fait aussi �l�gant que ce que tu aurais dans des langages vectoriels (fa�on APL, en J, par exemple, tu �cris un truc comme base+pas*i.nb_vals), mais c'est une bonne approximation.
Francois
Partager