2011-10-08 56 views
1

典型的例子使用STL的算法:调用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算法不是选项。我需要更优雅的解决方案。

+0

我也在考虑boost :: lambda或boost :: phoenix,他们创建的可读性较差的表达式? – sigidagi

回答

9

既然你标记C++11的问题,那么你可以使用拉姆达为:

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

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) 
); 
+0

+1 Cheeky :) <占位符15个字符评论> –

5

这是使用lambda表达式的好地方:

#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);}); 
}