是否可以编写类似于mem_fun
和bind1st
等的内容,以便将for_each
等STL算法应用于多个参数?当然,除了一个参数之外的所有参数都被给出,而没有参数的那个参数将由容器元素填充。
有谁可以举这样的例子?
答案 0 :(得分:5)
您要找的是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
答案 1 :(得分:4)
在我看来,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还可以轻松处理使用bind和朋友的情况,例如:
std::transform(begin(v), end(v), begin(v), [](int n) { return n * ((double)rand() / RAND_MAX); });
答案 2 :(得分:1)
在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
,以便您可以比较和理解符号的含义。