algorithms

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
alex
Le #308731
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 ;-)

Michel Decima
Le #308730
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();

Michael DOUBEZ
Le #308729
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

Michel Decima
Le #308728

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 ;)

Michael DOUBEZ
Le #308727
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


AG
Le #308726
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.

Publicité
Poster une réponse
Anonyme