Лямбда-нотация сделала алгоритмы stl более доступными. Я все еще участвую в том, чтобы решать, когда это полезно, и когда нужно вернуться к старым старинным петлям. Часто возникает необходимость перебирать два (или более) контейнера одного размера, так что соответствующие элементы связаны, но по какой-то причине не упаковываются в один класс.
Функция, использующая for-loop для достижения этого, будет выглядеть так:
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. Я добавил ответ с примером кода для полноты.