在STL算法中调用多个函数

时间:2011-10-08 19:14:26

标签: c++ boost c++11

使用STL算法的经典示例:

void foo(int){};
vector<int> collection;
collection.push_back(3);
collection.push_back(4);
... etc.

std::for_each(collection.begin(), collection.end(), bind(foo, _1));

但是,如果我们有多个函数,需要使用相同的参数值调用,那该怎么办:

void bar(int){};
void beer(int){};
... etc.

每次使用不同的函数重复for_each算法都不是选项。我需要更优雅的解决方案。

3 个答案:

答案 0 :(得分:9)

由于您使用C++11标记了问题,因此您可以将lambda用作:

std::for_each(collection.begin(), collection.end(), [](int a)
{
   bar(a);    
   beer(a);
});

我记得C ++ 11有std::beginstd::end作为自由函数,它应该比成员函数更受欢迎:

std::for_each(std::begin(collection), std::end(collection), [](int a)
{
   bar(a);    
   beer(a);
});

自由函数应该首选的基本原理是因为现在,例如,如果您将集合的类型更改为简单数组(例如,int collection[100]),那么上面的代码可以正常工作而无需更改单个字符。使用新的标准C ++,自由函数将比成员函数更加统一使用。

或者,您可以将基于范围的 for循环用作:

for(int a : collection)
{
   bar(a);    
   beer(a);
}

啊!它看起来更好。整洁干净,完全没有beginend

答案 1 :(得分:5)

这是一个使用lambdas的好地方:

#include <vector>
#include <algorithm>

void bar(int){};
void beer(int){};

int main()
{
    std::vector<int> collection;
    collection.push_back(3);
    collection.push_back(4);
    std::for_each(collection.begin(), collection.end(),
                  [](int i) {bar(i); beer(i);});
}

答案 2 :(得分:2)

也许是这样的事情?

void bunch_of_functions( int arg )
{
    foo( arg );
    bar( arg );
    foobar( arg );
}

std::for_each(
    collection.begin(), collection.end()
  , bind(bunch_of_functions, _1)
);