首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL算法中的多个函数调用

STL算法中的多个函数调用
EN

Stack Overflow用户
提问于 2011-10-09 03:14:26
回答 3查看 144关注 0票数 1

使用STL算法的经典示例:

代码语言:javascript
复制
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));

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

代码语言:javascript
复制
void bar(int){};
void beer(int){};
... etc.

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-09 03:20:45

既然你用C++11标记了问题,那么你可以这样使用lambda:

代码语言:javascript
复制
std::for_each(collection.begin(), collection.end(), [](int a)
{
   bar(a);    
   beer(a);
});

我记得C++11将std::beginstd::end作为自由函数,应该优先于成员函数:

代码语言:javascript
复制
std::for_each(std::begin(collection), std::end(collection), [](int a)
{
   bar(a);    
   beer(a);
});

之所以首选自由函数,是因为现在,例如,如果您将集合的类型更改为简单数组(例如,int collection[100]),那么上面的代码就可以很好地工作,而不需要更改任何字符。在新的标准C++中,自由函数的使用将比成员函数更统一。

或者,您可以使用基于范围的for循环,如下所示:

代码语言:javascript
复制
for(int a : collection)
{
   bar(a);    
   beer(a);
}

阿!它看起来更好。整洁干净,根本没有beginend

票数 9
EN

Stack Overflow用户

发布于 2011-10-09 03:19:52

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

代码语言:javascript
复制
#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);});
}
票数 5
EN

Stack Overflow用户

发布于 2011-10-09 03:18:34

也许是这样的吧?

代码语言:javascript
复制
void bunch_of_functions( int arg )
{
    foo( arg );
    bar( arg );
    foobar( arg );
}

std::for_each(
    collection.begin(), collection.end()
  , bind(bunch_of_functions, _1)
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7699167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档