генерировать с использованием лямбды и back_inserter в C ++ - PullRequest
4 голосов
/ 28 декабря 2011

Я недавно начал использовать новые функции C ++ 11, такие как лямбда-выражения, для облегчения чтения моего кода.

В этом примере я хочу сгенерировать вектор чисел, отсортированных от [0 до n]случайным образом.У меня есть некоторый код, подобный следующему

    #include <vector>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    void _generateRandomIndices(vector<unsigned int> & indices,
                const unsigned int & n) {
        indices.clear();
        unsigned int i = 0;
        generate_n(back_inserter(indices), n , [&i] ()-> unsigned int{ 
                                                              return i++;
                                                                     } );
        random_shuffle(indices.begin(), indices.end());
    } 

Однако использование g ++ 4.6 в Windows (с флагом -std = c ++ 0x) выдало мне следующую ошибку:

no matching function for call to 'generate_n(std::back_insert_iterator<std::vector<unsigned int> >, const unsigned int&, _generateRandomIndices(std::vector<unsigned int>&, const unsigned int&)::<lambda()>)'

Как правильно использовать лямбда-выражение в этом случае?

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Похоже, вам не хватает #include <algorithm>, поскольку GCC 4.5.1 и MSVC10 без ошибок компилируют следующий код:

#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

void _generateRandomIndices(vector<unsigned int> & indices,
        const unsigned int & n) {
    indices.clear();
    unsigned int i = 0;
    generate_n(back_inserter(indices), n , [&i] ()-> unsigned int{ 
                                                          return i++;
                                                                 } );
    random_shuffle(indices.begin(), indices.end());
}

int main(){
}
0 голосов
/ 28 декабря 2011

Вы должны добавить эту опцию компилятора -std = c ++ 0x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...