诸如for_each的STL算法应用于多个参数

时间:2012-03-29 15:29:08

标签: c++

是否可以编写类似于mem_funbind1st等的内容,以便将for_each等STL算法应用于多个参数?当然,除了一个参数之外的所有参数都被给出,而没有参数的那个参数将由容器元素填充。

有谁可以举这样的例子?

3 个答案:

答案 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,以便您可以比较和理解符号的含义。