Можно ли использовать алгоритм STL for_each, используя функцию с независимыми входными параметрами? - PullRequest
1 голос
/ 16 декабря 2010

В данный момент я запускаю цикл for, где я выполняю вызов для каждого элемента в контейнере STL, как показано ниже.

void AddToUpdate(iterator iter, Update& Update) {...};

...

Update update;
for(iterator iter = container.begin(); iter != container.end(); ++iter)
    AddToUpdate(iter, update);

Я смотрю на алгоритм STL for_each, как кажетсячтобы соответствовать моим потребностям.

Мне было интересно, возможно ли, учитывая использование второго входного параметра для функции, применяемой к контейнеру, возможно ли реорганизовать это, чтобы использовать стандартный алгоритм STL без использования переменных-членов илидругие лазейки?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Различные std::bind1st / std::bind2nd и Boost.bind библиотеки были созданы для решения вашей проблемы (что характерно почти для всех, кто использовал алгоритмы STL), но часто они просто кажутсяОбходной путь вместо решения.

К счастью, с наступающим стандартом C ++ долгожданное добавление лямбда-функций должно окончательно решить проблему.Однако обратите внимание, что, поскольку std::for_each вызывает функтор, передавая разыменованный итератор (т. Е. Фактическое значение, которое рассматривается), ваша AddToUpdate функция должна принимать не итератор, а значение.

В таком случаеэто было бы что-то вроде этого:

Update update;
std::foreach(container.begin(); container.end(); [ & update](TypeOfTheValue Value) {
    AddToUpdate(Value, update);
});
4 голосов
/ 16 декабря 2010

Вы хотите использовать std::bind2nd() - http://www.cplusplus.com/reference/std/functional/bind2nd/

В основном это возвращает унарный объект функции из функции с 2 аргументами, где второй аргумент является фиксированным.

Вот так должен выглядеть ваш код с for_each и bind2nd:

Update update;
for_each(container.begin(), container.end(), bind2nd(ptr_fun(AddToUpdate), update));

Редактировать. Как заметил Маттео, первый аргумент AddToUpdate должен быть типом значения в контейнере, а не итератором.

...