gpt4 book ai didi

c++ - 使用 std::bind 从 BinaryPredicate 创建 UnaryPredicate 以在 std::transform 中使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:48 24 4
gpt4 key购买 nike

我最近遇到了 for_each 的这种用法:

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

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

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

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

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 有误。我的错误是什么?

最佳答案

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

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

关于c++ - 使用 std::bind 从 BinaryPredicate 创建 UnaryPredicate 以在 std::transform 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18728203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com