调用STL算法中的多个函数

calling more than one function in STL algorithm

本文关键字:函数 STL 算法 调用      更新时间:2023-10-16

使用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算法是不可选择的。我需要更优雅的解决方案。

既然您用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

这将是使用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);});
}

也许是这样的?

void bunch_of_functions( int arg )
{
    foo( arg );
    bar( arg );
    foobar( arg );
}
std::for_each(
    collection.begin(), collection.end()
  , bind(bunch_of_functions, _1)
);