ラムダ表記により、stlアルゴリズムのアクセシビリティが向上しました。私はそれがいつ役に立つのか、良い時代のfor-loopsにいつ陥るのかを決めることを学んでいます。 対応する要素が関連しているが、なんらかの理由で同じクラスにパックされないように、同じサイズの2つ(またはそれ以上)のコンテナを繰り返し処理する必要が生じることがよくあります。std :: for_eachは複数のイテレータの範囲で作業しています
それは次のようになります達成するために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のアルゴリズムを使用して同じ結果を達成するための同等の方法はありますか?
EDITは私が範囲::ブースト上で実行されているブースト:: for_eachの形で私の質問に正確な答えを見つけました。私は完全性のためにサンプルコードを使って答えを加えました。
あなたはすでに書いた 'for_each_two_ranges'を使ってみませんか? – Puppy
それは私にとってとても一般的なもののように見えます。すでに誰かが解決したと思います。 – killogre
Boost.Iteratorから 'zip_iterator'があなたの望むことをすると思います。詳細については、http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/zip_iterator.htmlを参照してください。 – celtschk