Ký hiệu lambda đã làm cho các thuật toán stl dễ tiếp cận hơn. Tôi vẫn đang học cách quyết định khi nào nó hữu ích và khi nào thì quay trở lại với các vòng lặp cũ. Thông thường, nó trở nên cần thiết để lặp qua hai (hoặc nhiều hơn) các thùng chứa có cùng kích thước, sao cho các phần tử tương ứng có liên quan, nhưng vì một lý do nào đó không được đóng gói trong cùng một lớp.std :: for_each làm việc trên nhiều loại vòng lặp
Một chức năng sử dụng một cho vòng lặp để đạt được điều đó sẽ trông như thế này:
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();
}
}
}
Để sử dụng for_each, tôi cần một phiên bản của nó để xử lý nhiều dãy; cái gì đó như:
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;
}
Với phiên bản này, các mã trên sẽ trông như thế này:
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ó một cách tương đương để đạt được kết quả tương tự sử dụng các thuật toán STL?
EDIT
Tôi tìm thấy câu trả lời chính xác cho câu hỏi của tôi dưới hình thức tăng :: for_each chạy trên boost :: tầm xa. Tôi đã thêm câu trả lời, với mã ví dụ vì mục đích hoàn chỉnh.
Tại sao không chỉ sử dụng 'for_each_two_ranges' mà bạn đã viết? – Puppy
Nó trông giống như một cái gì đó rất phổ biến với tôi, rằng tôi nghĩ rằng nó đã được giải quyết bởi ai đó đã – killogre
Tôi nghĩ 'zip_iterator' từ Boost.Iterator làm những gì bạn muốn. Xem http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/zip_iterator.html để biết chi tiết. – celtschk