std :: for_each работает с несколькими диапазонами итераторов

Лямбда-нотация сделала алгоритмы stl более доступными. Я все еще учусь решать, когда это полезно, а когда вернуться к старым добрым петлям. Часто возникает необходимость перебора двух (или более) контейнеров одинакового размера, чтобы соответствующие элементы были связаны, но по какой-то причине не упакованы в один и тот же класс.

Функция, использующая цикл for для достижения этого, будет выглядеть так:

template<typename Data, typename Property>
void foo(vector<Data>& data, vector<Property>& prop) {
    auto i_data = begin(data);
    auto i_prop = begin(prop);
    for (; i_data != data.end(); ++i_data, ++i_prop) {
        if (i_prop->SomePropertySatistfied()) {
            i_data->DoSomething();
        }
    }
}

Чтобы использовать for_each, мне нужна его версия, которая обрабатывает несколько диапазонов; что-то вроде:

template<typename InputIter1, typename InputIter2, typename Function>
Function for_each_on_two_ranges(InputIter1 first1, InputIter1 last1, InputIter2 first2, Function f) {
    for (; first1 != last1; ++first1, ++first2) {
        f(*first1, *first2);
    }
    return f;
}

В этой версии приведенный выше код будет выглядеть так:

template<typename Data, typename Property>
void foo_two_ranges(vector<Data>& data, vector<Property>& prop) {
    for_each_on_two_ranges(begin(data), end(data), begin(prop), [](Data& d, Property& p) {
        if (p.SomePropertySatistfied()) {
            d.DoSomething();
        }
    });
}

Есть ли эквивалентный способ достижения того же результата с использованием алгоритмов STL?

РЕДАКТИРОВАТЬ

Я нашел точный ответ на мой вопрос в виде boost :: for_each, работающего на boost :: range. Я добавил ответ, с примером кода для полноты.

Ответы на вопрос(3)

Ваш ответ на вопрос