La notazione lambda ha reso gli algoritmi di stl più accessibili. Sto ancora imparando a decidere quando è utile e quando ricadere in un buon vecchio stile. Spesso, diventa necessario iterare su due (o più) contenitori della stessa dimensione, in modo tale che gli elementi corrispondenti siano correlati, ma per qualche motivo non sono raggruppati nella stessa classe.std :: for_each funziona su più di un intervallo di iteratori
Una funzione utilizza un ciclo for per ottenere che sarebbe simile a questa:
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();
}
}
}
Per poter utilizzare for_each, ho bisogno di una versione di esso che gestisce più intervalli; qualcosa di simile:
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;
}
Con questa versione, il codice di cui sopra sarebbe simile a questa:
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();
}
});
}
C'è un modo equivalente di ottenere lo stesso risultato utilizzando algoritmi STL?
EDIT
ho trovato la risposta esatta alla mia domanda in forma di boost :: for_each esecuzione su boost :: gamma. Ho aggiunto la risposta, con codice di esempio per motivi di completezza.
Perché non usare semplicemente "for_each_two_ranges" che hai già scritto? – Puppy
Sembra una cosa così comune per me, che penserei che sia stato risolto da qualcuno già – killogre
Penso che "zip_iterator" di Boost.Iterator fa quello che vuoi. Vedi http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/zip_iterator.html per i dettagli. – celtschk