Инициализация списка с for_each для случайных величин - PullRequest
1 голос
/ 10 февраля 2010

Я пытаюсь инициализировать список случайными целыми числами, используя функцию for_each и lambda. Я новичок в функциях boost.lambda, поэтому я могу использовать это неправильно, но следующий код выдает список тех же номеров. Каждый раз, когда я запускаю его, число отличается, но все в списке одинаково:

srand(time(0));

theList.resize(MaxListSize);

for_each(theList.begin(), theList.end(), _1 = (rand() % MaxSize));

1 Ответ

7 голосов
/ 10 февраля 2010

Boost lambda оценивает rand до создания функтора. Вам нужно bind, чтобы оно оценивалось во время лямбда-оценки:

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp> // for bind
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>

int main()
{
    namespace bl = boost::lambda;
    typedef std::vector<int> int_vec;

    static const size_t MaxListSize = 10;
    static const int MaxSize = 20;

    int_vec theList;
    theList.resize(MaxListSize);

    std::srand(static_cast<unsigned>(std::time(0)));
    std::for_each(theList.begin(), theList.end(),
                    bl::_1 = bl::bind(std::rand) % MaxSize);

    std::for_each(theList.begin(), theList.end(), std::cout << bl::_1 << ' ' );
}

Это работает как ожидалось.

Однако, правильное решение должно использовать generate_n. Зачем делать кучу 0, чтобы просто перезаписать их?

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>

int main()
{
    namespace bl = boost::lambda;
    typedef std::vector<int> int_vec;

    static const size_t MaxListSize = 10;
    static const int MaxSize = 20;

    int_vec theList;
    theList.reserve(MaxListSize); // note, reserve

    std::srand(static_cast<unsigned>(std::time(0)));
    std::generate_n(std::back_inserter(theList), MaxListSize,
                        bl::bind(std::rand) % MaxSize);

    std::for_each(theList.begin(), theList.end(), std::cout << bl::_1 << ' ' );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...