Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用lambda和back插入器生成+;_C++_Lambda_C++11 - Fatal编程技术网

C++ 在C+中使用lambda和back插入器生成+;

C++ 在C+中使用lambda和back插入器生成+;,c++,lambda,c++11,C++,Lambda,C++11,我最近开始使用新的C++11特性,如lambda表达式,以使代码更易于阅读 在本例中,我想生成一个随机排序的数字[0到n]向量。我有一些类似于下面的代码 #include <vector> #include <algorithm> #include <iterator> using namespace std; void _generateRandomIndices(vector<unsigned int>

我最近开始使用新的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());
    } 
#包括
#包括
#包括
使用名称空间std;
void _生成器优势(向量和索引,
常量无符号整数(&n){
索引。清除();
无符号整数i=0;
生成n(返回插入器(索引),n,[&i]()->无符号整数{
返回i++;
} );
随机洗牌(index.begin(),index.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()>)'
调用“generate_n(std::back_insert_iterator,const unsigned int&,_generateRandomIndices(std::vector&,const unsigned int&)”时没有匹配函数

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

听起来您缺少了一个
#include以及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;
void _生成器优势(向量和索引,
常量无符号整数(&n){
索引。清除();
无符号整数i=0;
生成n(返回插入器(索引),n,[&i]()->无符号整数{
返回i++;
} );
随机洗牌(index.begin(),index.end());
}
int main(){
}

您应该添加这个编译器选项-STD= C++ +0x

没有编译器选项,GCC会在lambda上阻塞,而不是<代码> GeaTyAgN>代码>算法。尽管如此,尽管它默认在G++ 4.6中启用,但GCC为即将到来的ISO C++标准C++ 0x提供了实验支持。可以使用-std=c++0x或-std=gnu++0x编译器选项启用此支持。在我的GCC4.5上,这段代码是用这个选项编译的。实际上,我包含了所有这些头文件,我只添加了必要的头文件code@sohaibafifi当前位置如果您确实包含了所有内容,那么您的stdlib可能会损坏。要么您得到了C++03 stdlib的包含路径,要么出现了其他问题。您在Windows上使用哪个GCC端口?@sohaibafi:然后仔细检查您的include路径并查看在那里找到的
标题。听起来很像您的stdlib和/或stdlib路径已断开。好的,我将使用generate\n from MinGW\lib\gcc\mingw32\4.6.1\include\c++\bits\algorithmfwd。h@sohaibafifi当前位置除了主线MinGW之外,我从来没有遇到过任何问题。我建议你试试看。这不是你问题的答案,但在C++11中你可以用它来代替。您的代码对我来说很好(明W32 32·1)。我已经退出C++循环一段时间了,所以猜测:它是不是<代码> const n>代码>不匹配代码>函数> <代码> >的函数签名?这就引出了我关于代码的一个问题:为什么要将
常量
引用为
无符号整数
,而不仅仅是
无符号整数
?它是一种简单的类型,因此副本的成本不应超过通过引用传递的成本,而且同样安全。请注意,通过引用传递以有效地返回新值在C++11中并不惯用——移动语义将使通过值返回变得高效。