2

我最近遇到了这种用法for_each

std::for_each(ts.begin(), ts.end(), [=](T& t){t *= f;});

嗯,它有效。对于 Ts 和 T f 的容器,这会将每个值乘以 f。但是我不喜欢在这里使用 lambda。它很短,但在我看来,它只重复了std::multiplies. 此外,它不应该是for_each, buttransform来表达修改的意图。

但是,std::multiplies是二元谓词,std::transform需要一元谓词。

我试图将 f 绑定为一个参数,但显然我用错了:

std::transform(ts.begin(), ts.end(), std::bind(std::multiplies<T>(), f));

GCC 尝试通过错误消息给我一个提示,但我没有看到实际原因:

no matching function for call to ‘transform(std::vector<int>::iterator, std::vector<int>::iterator, std::_Bind_helper<false, std::multiplies<int>, const int&>::type)’

我怀疑我用std::bind错了。我的错误是什么?

4

1 回答 1

3

您忘记了结果范围的迭代器和绑定表达式中的占位符:

std::transform(
    ts.begin(), ts.end(), // source range
    ts.begin(),           // beginning of result range
    std::bind(std::multiplies<int>(), f, std::placeholders::_1) );
    //                                   ^^^^^^^^^^^^^^^^^^^^^
    //                                   this is where the value from
    //                                   dereferenced source iterator go
于 2013-09-10T20:34:40.943 回答