generate_n在c++中使用lambda和back_inserter

generate_n using lambda and back_inserter in C++

本文关键字:lambda inserter back c++ generate      更新时间:2023-10-16

我最近开始使用新的c++ 11特性,如lambda表达式,使我的代码更容易阅读。

在这个例子中,我想生成一个随机排序的数字向量[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());
    } 

然而,在windows上使用g++ 4.6(带有-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()>)'

在这种情况下使用lambda表达式的正确方法是什么?

听起来您缺少#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(){
}

你应该添加这个编译器选项-std=c++0x