C++ 在C+中使用lambda和back插入器生成+;
我最近开始使用新的C++11特性,如lambda表达式,以使代码更易于阅读 在本例中,我想生成一个随机排序的数字[0到n]向量。我有一些类似于下面的代码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>
#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中并不惯用——移动语义将使通过值返回变得高效。