[STL] additionner chaque menbre par 2

additionner chaque menbre par 2 [STL] - C++ - Programmation

Marsh Posté le 27-06-2003 à 22:53:02    

voilou a tout hasard je vous savoir s'il y avait une fonction qui me permettrait d'incrementer chaque menbre d'une list de float de 0.2.
 
Pour l'instant j'ai parcourus ma list, mais y a peut etre un algo plus performant  
 
j'ai regardé la  
http://www.sgi.com/tech/stl/plus.html
ms y a ecrit :

Citation :

Each element in V3 will be the sum of the corresponding elements in V1 and V2


or moi j'aimerais faire la somme entre une liste float avec un float et non pas entre 2 list...

Reply

Marsh Posté le 27-06-2003 à 22:53:02   

Reply

Marsh Posté le 27-06-2003 à 23:00:28    

t'as deux formes de transform, et si t'avais lu la doc de transform, t'aurais vu qu'il peut être utilisé pour les transformations sur-place.
Dans ton cas
 

Code :
  1. std::transform (lst.begin (), lst.end (), lst.begin (), std::bind2nd (std::plus<float> (), 0.2));

Reply

Marsh Posté le 29-06-2003 à 03:56:02    

a comparer avec la forme intuitive :
for (it = lst.begin(); it != lst.end(); ++lst) *it += 0.2f;
 
Enfin, si c'est juste pour l'exemple, je dis pas..
 
LeGreg

Reply

Marsh Posté le 29-06-2003 à 11:00:59    

si tu veux qu'on complique un peux la sauce, on va voir ce qui est le plus intuitif... :D

Reply

Marsh Posté le 29-06-2003 à 11:04:34    

++Taz a écrit :

si tu veux qu'on complique un peux la sauce, on va voir ce qui est le plus intuitif... :D


 
la question n'est pas de compliquer pour compliquer.
 
Effectivement on peut apprendre a se servir de transform sur un exemple simple mais ce n'etait pas la question posee il me semble.
 
En plus j'aurais plutot applique for_each moi mais je suis un chieur.
 
LeGreg

Reply

Marsh Posté le 29-06-2003 à 11:05:57    

legreg a écrit :


 
la question n'est pas de compliquer pour compliquer.
 
Effectivement on peut apprendre a se servir de transform sur un exemple simple mais ce n'etait pas la question posee il me semble.
 
En plus j'aurais plutot applique for_each moi mais je suis un chieur.
 
LeGreg


for_each ne modifie pas la séquence d'entrée

Reply

Marsh Posté le 29-06-2003 à 11:15:11    

Faut qu'on m'explique ce qu'affiche ce programme alors:
 

Code :
  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. struct multbytwo
  6. {
  7.     void operator () (float & f)
  8.     {
  9.         f *= 0.2f;
  10.     }
  11. };
  12. struct print
  13. {
  14.     void operator () (float & f)
  15.     {
  16.         cout << f << endl;
  17.     }
  18. };
  19. int main()
  20. {
  21.    vector <float> toto;
  22.    toto.push_back(2.0f);
  23.    toto.push_back(3.0f);
  24.    toto.push_back(4.0f);
  25.    for_each(toto.begin(), toto.end(), multbytwo());
  26.    for_each(toto.begin(), toto.end(), print());
  27.    return 0;
  28. }


 
LeGreg

Reply

Marsh Posté le 29-06-2003 à 11:21:32    

je trouve assez crade l'utilisation de for_each pour des modifications, c'est pour ça que je préfère transform. pour la peine ta version est plus longue...
 
et ton for_each print, il va vite se rhabiller devant
 
copy(v.begin(), v.end(), ostream_iterator<float>(cout, "\n" ));

Reply

Marsh Posté le 29-06-2003 à 11:25:04    

enfin ç afait plaisir, y a quelques temps, c'etait assez inimaginable qu'on discute sur des questions d'esthétisme :jap:

Reply

Marsh Posté le 29-06-2003 à 11:29:01    

gloop a écrit :


for_each ne modifie pas la séquence d'entrée


 
J'ai ete inexact..
 
Il le fait mais si tu violes le template qui se laisse faire puisque de toute facon le C++ n'impose aucune contrainte sur les arguments d'un template.
 
De plus quand l'entree et la sortie sont la meme, autant utiliser la version auto-modifiante, mais c'est presque philosophique tant qu'il n'y a pas de surcout en performance.
 
C'est la raison pour laquelle on a des  
"*=" et des "= . * ."
 
Au moins l'ecriture est plus compacte.
 
LeGreg
 
 

Reply

Marsh Posté le 29-06-2003 à 11:29:01   

Reply

Marsh Posté le 29-06-2003 à 11:38:21    

j'avais pas pensé à cette possibilité de for_each. mais je trouve ca quand meme moins clair  :D
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed