我得到了这个看起来很奇怪的std :: generate()函数,该函数创建a和b之间随机数的std :: vector。
int myrand(int a, int b)
{
int div = b-a;
return a + (rand() % (b-a));
}
int main()
{
vector<int> v(20);
generate( v.begin(), v.end(), bind(myrand,1, 11) ); //fill with random no. bwt 1 and 10
return 0;
}
我知道std :: generate()函数的工作方式,必须将谓词传递给第三个参数。谓词可以采用函数,函数对象或函数指针的形式。
但是我对表达式bind(myrand,1, 11)
感到很困惑,为什么我们必须这样写?
我知道bind
返回的函数可以在此处作为第三个参数放置。
但是myrand
也是函数吗?我试图用[myrand(1,11)
替换第三个参数,但是它不起作用,为什么会这样?
std::bind
接受一个功能对象,以及您想要传递给该功能对象的东西,并返回一个功能对象,该对象将使用这些参数调用提供的功能对象。这意味着
auto foo = bind(myrand,1, 11);
foo();
与]相同>
myrand(1, 11);
尽管为了使生活更轻松,您可以避免使用
bind
,而只使用lambda。这样做会给你
generate( v.begin(), v.end(), [](){ return myrand(1, 11); });
而且,至少对我来说,这很清楚,您得到的对象是每次调用它的
myrand(1, 11)
都将返回operator()
。
std::bind
不返回函数,它返回已实现的函数调用运算符std::bind
的object
绑定返回可调用对象。当您绑定int
的两个参数时,生成的callbale将不带任何参数。可以像
为什么...使用bind()
但是我对表达式
int
非常困惑,为什么我们必须这样写吗?