
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