我给了这个看起来很奇怪的std::generate()函数,它std::vector在a和b之间创建一个随机数。
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;
}
Run Code Online (Sandbox Code Playgroud)
我知道std::generate()函数是如何工作的,必须将谓词传递给第三个参数。谓词可以采用以下形式:
但是我对表达式很困惑bind(myrand,1, 11),为什么我们必须这样写呢?
我知道bind返回的函数可以放在这里作为第三个参数。
但是,myrand功能也不是吗?我尝试将第三个参数替换为myrand(1,11),但它不起作用,为什么会这样呢?
std::bind接受一个函数对象,以及要传递给函数对象的东西,并返回一个函数对象,该函数对象将使用这些参数调用提供的函数对象。那意味着
auto foo = bind(myrand,1, 11);
foo();
Run Code Online (Sandbox Code Playgroud)
是相同的
myrand(1, 11);
Run Code Online (Sandbox Code Playgroud)
为了使生活更轻松,您可以避免bind使用lambda。这样做会给你
generate( v.begin(), v.end(), [](){ return myrand(1, 11); });
Run Code Online (Sandbox Code Playgroud)
而且,至少对于我来说,这清楚得多了,您得到的对象在myrand(1, 11)每次调用它时都会返回operator()。
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |