Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

algorithms

6 réponses
Avatar
AG
Bonjour,

Pour l'instant, j'ai ça :

typename vector<T>::iterator iMin = min_element(v.begin(),v.end());
for(int i=0;i<b.size();i++) v[i] -= *iMin;

est-ce que l'on peut faire aussi court avec les algorithmes de la stl
? et si oui, comment ?

AG.

6 réponses

Avatar
alex
bonjour,

typename vector<T>::iterator iMin = min_element(v.begin(),v.end());
for(int i=0;i<b.size();i++) v[i] -= *iMin;

est-ce que l'on peut faire aussi court avec les algorithmes de la stl ? et
si oui, comment ?


std::transform(v.begin(),v.end(),v.begin(),std::bind2nd(std::minus<T>,*iMin));

pas sûr que ça soit + lisible par contre ;-)

Avatar
Michel Decima
Pour l'instant, j'ai ça :

typename vector<T>::iterator iMin = min_element(v.begin(),v.end());
for(int i=0;i<b.size();i++) v[i] -= *iMin;


Qu'est ce que ca fait exactement ? Parce que j'ai l'impression que
tu modifies la valeur de *iMin dans la boucle.

est-ce que l'on peut faire aussi court avec les algorithmes de la stl
? et si oui, comment ?


En gardant le vector, ca pourrait ressembler a ca:

std::transform( v.begin(), v.end(), v.begin(),
std::bind2nd( std::minus<T>(),
std::min_element( v.begin(), v.end() )
)
);

Je ne sais pas si c'est vraiment plus court, et il n'y a pas exactement
le meme comportement (pas de modification de *iMin).

Si le but c'est vraiment de faire plus court, et que tu peux remplacer
le vector par un valarray, ca donnerait ca:

v -= v.min();

Avatar
Michael DOUBEZ
Bonjour,

Pour l'instant, j'ai ça :

typename vector<T>::iterator iMin = min_element(v.begin(),v.end());
for(int i=0;i<b.size();i++) v[i] -= *iMin;

est-ce que l'on peut faire aussi court avec les algorithmes de la stl
? et si oui, comment ?


Tu peux remplacer la boucle par transform
transform(v.begin(), v.end(), v.begin(),bind2nd(minus<T>(),*iMin));

Michael

Avatar
Michel Decima

min_element renvoit un ForwardIterator donc ce serait
bind2nd(minus<T>(), * min_element());


Oui, faute de frappe...

Si il veut faire comme sa version "buggée", il peut toujours appliquer
transform sur le range [v.begin() ; iMin].


re-oui. Et eventuellement rajouter *iMin -= *iMin ;)

Avatar
Michael DOUBEZ
Pour l'instant, j'ai ça :

typename vector<T>::iterator iMin = min_element(v.begin(),v.end());
for(int i=0;i<b.size();i++) v[i] -= *iMin;


Qu'est ce que ca fait exactement ? Parce que j'ai l'impression que
tu modifies la valeur de *iMin dans la boucle.

est-ce que l'on peut faire aussi court avec les algorithmes de la stl
? et si oui, comment ?


En gardant le vector, ca pourrait ressembler a ca:

std::transform( v.begin(), v.end(), v.begin(),
std::bind2nd( std::minus<T>(),
std::min_element( v.begin(), v.end() )
)
);



min_element renvoit un ForwardIterator donc ce serait
bind2nd(minus<T>(), * min_element());

Je ne sais pas si c'est vraiment plus court, et il n'y a pas exactement
le meme comportement (pas de modification de *iMin).


Si il veut faire comme sa version "buggée", il peut toujours appliquer
transform sur le range [v.begin() ; iMin].

Michael


Avatar
AG
Qu'est ce que ca fait exactement ? Parce que j'ai l'impression que
tu modifies la valeur de *iMin dans la boucle.
effectivement, il y un bug dans mon truc. désolé.


Merci pour vos réponses qui me satisfont quand même.

AG.