为什么以及如何在C ++中使用bind()作为谓词?

Jer*_*emy 1 c++ c++11

我给了这个看起来很奇怪的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),但它不起作用,为什么会这样呢?

Nat*_*ica 6

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()


Som*_*ude 5

std::bind不返回函数,而是返回实现了函数调用运算符的对象operator()。该对象是函子对象,可以像函数一样调用它。

使用时,myrand(1, 11)请调用函数myrand并将int结果传递给std::generateint不能像函数一样“调用” 此值。