Использование форсированных лямбд - PullRequest
2 голосов
/ 30 ноября 2009

Я новичок в повышении и пытаюсь написать несколько простых программ, чтобы понять это. Здесь, в следующем фрагменте кода, я пытаюсь заполнить массив случайными числами. Вот мой код:

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

Но похоже, что rand() оценивается только один раз, и мой массив содержит одинаковые значения для каждого элемента. Кто-нибудь может указать, что не так с этим кодом?

Ответы [ 2 ]

10 голосов
/ 30 ноября 2009

Похоже, вам нужно использовать отложенный вызов функции

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

Вот еще одна интересная ситуация: Задержка констант и переменных

4 голосов
/ 30 ноября 2009

Ваш код эквивалентен следующему:

using namespace boost::lambda;

srand(time(NULL));

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

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

То, что вы хотите, это вызывать rand для каждого элемента; обычно это делается с использованием std :: generate, как отмечено в комментарии @ MP24:

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