вызов более чем одной функции в алгоритме STL - PullRequest
1 голос
/ 08 октября 2011

Классический пример с использованием алгоритмов 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 ]

9 голосов
/ 08 октября 2011

Поскольку вы пометили вопрос с помощью C++11, вы можете использовать лямбда-выражения как:

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

Напомню, что в C ++ 11 есть std::begin и std::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);
}

Ах!Это выглядит даже лучше.Аккуратный и чистый, без begin и end вообще.

5 голосов
/ 08 октября 2011

Это было бы хорошим местом, чтобы использовать лямбды:

#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 голосов
/ 08 октября 2011

Что-то вроде этого, возможно?

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

std::for_each(
    collection.begin(), collection.end()
  , bind(bunch_of_functions, _1)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...