lambda表示法使得stl算法更易於訪問。我仍然在學習如何決定什麼時候有用,什麼時候回到老式的循環。 通常,就有必要迭代相同大小的兩個(或多個)容器中,以使得相應的元件是相關的,但由於某些原因未打包到同一類別。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算法同樣結果的等效方法是什麼?
編輯
我找到確切的答案,我的問題中的boost ::升壓::範圍運行的for_each的形式。爲了完整起見,我添加了答案和示例代碼。
爲什麼不直接使用已經寫好的'for_each_two_ranges'? – Puppy 2012-04-02 11:58:28
它看起來像我這麼普遍,我認爲它已經被某人已經解決了 – killogre 2012-04-02 12:01:25
我認爲來自Boost.Iterator的'zip_iterator'做你想做的。有關詳細信息,請參閱http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/zip_iterator.html。 – celtschk 2012-04-02 12:23:51