【发布时间】:2012-03-29 15:29:08
【问题描述】:
是否可以编写类似于mem_fun 和bind1st 等的内容,以便将for_each 等STL 算法应用于多个参数?当然,除了一个参数外,所有参数都给出,没有的将由容器元素填充。
谁能举个例子?
【问题讨论】:
标签: c++
是否可以编写类似于mem_fun 和bind1st 等的内容,以便将for_each 等STL 算法应用于多个参数?当然,除了一个参数外,所有参数都给出,没有的将由容器元素填充。
谁能举个例子?
【问题讨论】:
标签: c++
您正在寻找的是std::bind 或其孪生boost::bind。它们是这样使用的:
std::vector<int> v = {1,2,3,4};
std::transform(begin(v), end(v), begin(v), std::bind(std::plus<int>(), _1, 23 ));
还可以查看尽可能多的错误迭代方式https://stackoverflow.com/a/8378613/105672
【讨论】:
std::bind 是 C++11 的一部分。如果你不能使用它,你可以从boost使用它。
在我看来,Lambda 更清晰。 pmr 使用 lambda 而不是 std::bind 的示例:
std::vector<int> v = {1,2,3,4};
std::transform(begin(v), end(v), begin(v), [](int n) { return n + 23 });
Lambdas 还可以轻松处理绑定和朋友比较困难的情况,例如:
std::transform(begin(v), end(v), begin(v), [](int n) { return n * ((double)rand() / RAND_MAX); });
【讨论】:
std::bind 不见了。
在 C++11 中,您也可以执行 @pmr 以这种方式发布的相同操作:
std::vector<int> v = {1,2,3,4};
std::transform(begin(v), end(v), begin(v), [](int _1) { return _1 + 23} );
将此与@pmr 的解决方案进行比较。
请注意,@pmr 解决方案中的_1 成为我的解决方案中 lambda 的参数。当然,您可以(事实上,应该)使用更好的名称;我使用了_1,以便您可以比较和理解符号的含义。
【讨论】: