2009-11-30 25 views
2

Je suis nouveau pour booster et essayer d'écrire des programmes simples pour le comprendre. Ici, dans le morceau de code suivant, j'essaie de remplir un tableau avec des nombres aléatoires. Voici mon code:Utilisation de boost lambdas

using namespace boost::lambda; 
    srand(time(NULL)); 
    boost::array<int,100> a; 
    std::for_each(a.begin(), a.end(), _1=rand()); 

Mais il semble que rand() obtient évalué une seule fois et mon tableau est contenant les mêmes valeurs pour chaque élément. Quelqu'un peut-il indiquer ce qui ne va pas avec ce code?

+0

Vous n'avez pas besoin d'utiliser boost :: lambda pour remplir le tableau avec des nombres aléatoires, soit dit en passant. Vous pourriez, par exemple, utiliser 'std :: generate (a.begin(), a.end(), &rand);'. – MP24

+0

peut-être que je peux le faire, mais je voudrais quand même savoir pourquoi cette approche ne fonctionnera pas .. – Naveen

Répondre

10

On dirait que vous devez utiliser delayed function call

std::for_each(a.begin(), a.end(), boost::lambda::_1= boost::lambda::bind(rand)); 

Voici une autre situation intéressante: Delaying constants and variables

+0

Merci .. a parfaitement fonctionné, je vais vérifier le fonctionnement des appels de fonction retardés. – Naveen

4

Votre code est équivalent à la suivante:

using namespace boost::lambda; 

srand(time(NULL)); 

boost::array<int, 100> a; 
int i = rand(); 

std::for_each(a.begin(), a.end(), _1=i); 

Qu'est-ce que vous voulez est rand être invoqué pour chaque élément; ceci est habituellement fait en utilisant std :: generate, comme noté @ MP24 dans un commentaire:

std::generate(a.begin(), a.end(), rand); 
Questions connexes