OVH Cloud OVH Cloud

std::for_each et incrémentation

4 réponses
Avatar
Michael
Bonsoir à tous,

je viens de remarquer la chose suivante:

#include <vector>
#include <functional>
#include <algorithms>
#include <iostream>

struct test
{
int foo;
test(int i) : foo(i) {}

void a(const int i)
{
foo = i;

std::cout << foo << std::endl;
}
};

int main(int argc, char* argv[])
{

std::vector<test *> liste;
liste.push_back(new test(3));
liste.push_back(new test(1));
liste.push_back(new test(5));
liste.push_back(new test(6));

int offset = 0;

std::for_each(liste.begin(),liste.end(),std::bind2nd(std::mem_fun
(&test::a),++offset));

for (std::vector<test *>::iterator ite = liste.begin(); ite != liste.end
(); ++ite)
delete *ite;

int toto;

return 0;
}

Il m'affiche toujours 0. Je pensais qu'à chaque tour de while dans le
for_each il m'aurait incrémenté offset, mais il n'en est rien...

Quel algorithme je peux utiliser pour changer test::foo via la fonction
test::a??

Merci d'avance

Mike

4 réponses

Avatar
Cyrille
Bonsoir à tous,


Bonjour.

Il m'affiche toujours 0.


Ah c'est bizarre, le programme tel qu'il est là ne devrait afficher que
des 1.

Je pensais qu'à chaque tour de while dans le
for_each il m'aurait incrémenté offset, mais il n'en est rien...


Non, il incrémente offset et il passe la valeur incrémentée (soit 1) à
std::bind2nd, qui ne passe donc que des 1 à foo::a.

Quel algorithme je peux utiliser pour changer test::foo via la fonction
test::a??


struct mon_objet_fonc
{
private:
int m_offset;
public:
mon_objet_fonc() : m_offset( 0 ) { }

void operator () ( test * obj )
{
obj->a( ++ m_offset );
}
};

et dans main:

std::for_each( liste.begin(), liste.end(), mon_objet_fonc() );

--
Hopp Schweiz!
Forza Korea!
Go Togo!

Avatar
Michael
Ah c'est bizarre, le programme tel qu'il est là ne devrait afficher que
des 1.


Exact, c'est parce qu'entre un test et ce que j'ai écrit, j'ai changé
offset++ en ++offset...

Je pensais qu'à chaque tour de while dans le
for_each il m'aurait incrémenté offset, mais il n'en est rien...


Non, il incrémente offset et il passe la valeur incrémentée (soit 1) à
std::bind2nd, qui ne passe donc que des 1 à foo::a.


Ok, je pensais que l'évaluation de offset se faisait à chaque tour...

Quel algorithme je peux utiliser pour changer test::foo via la fonction
test::a??


struct mon_objet_fonc
{
private:
int m_offset;
public:
mon_objet_fonc() : m_offset( 0 ) { }

void operator () ( test * obj )
{
obj->a( ++ m_offset );
}
};

et dans main:

std::for_each( liste.begin(), liste.end(), mon_objet_fonc() );



Ca marche, merci à toi...


Avatar
Fabien LE LEZ
On 18 Dec 2005 04:03:10 GMT, Michael :

Ok, je pensais que l'évaluation de offset se faisait à chaque tour...


Non. Dans ton expression for_each, tu crées un objet (plus
précisément, un foncteur) que tu initialises avec "++offset".
Puis, tu appelles (une fois) la fonction for_each avec (entre autres)
cet objet en paramètre.

C'est très différent de for(;;), qui est une boucle (et pas une
fonction).

Avatar
Michael
Non. Dans ton expression for_each, tu crées un objet (plus
précisément, un foncteur) que tu initialises avec "++offset".
Puis, tu appelles (une fois) la fonction for_each avec (entre autres)
cet objet en paramètre.

C'est très différent de for(;;), qui est une boucle (et pas une
fonction).


Effectivement, j'ai regardé au code de for_each, et c'est devenu plus
clair...