Có một bộ chuyển đổi container nào sẽ đảo ngược hướng của các trình vòng lặp để tôi có thể lặp qua một container ngược lại với vòng lặp for-loop dựa trên phạm vi không?
Với các trình vòng lặp rõ ràng tôi sẽ chuyển đổi điều này:
for (auto i = c.begin(); i != c.end(); ++i) { ...
vào đây:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Tôi muốn chuyển đổi cái này:
for (auto& i: c) { ...
đến đây:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Có một điều như vậy hoặc tôi phải tự viết nó?
begin
đến end
, hoặc để đối phó với biến lặp suối và những thứ tương tự. Các thuật toán phạm vi sẽ là tuyệt vời, nhưng chúng thực sự chỉ là cú pháp cú pháp (ngoại trừ khả năng đánh giá lười biếng) so với các thuật toán lặp.
template<typename T> class reverse_adapter { public: reverse_adapter(T& c) : c(c) { } typename T::reverse_iterator begin() { return c.rbegin(); } typename T::reverse_iterator end() { return c.rend(); } private: T& c; };
Nó có thể được cải thiện (thêm const
phiên bản, v.v.) nhưng nó hoạt động: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
bản in321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
Vì vậy, sau đó bạn chỉ có thể sử dụng for(auto &i: reverse_adapt_container(v)) cout << i;
để lặp lại.
parallel_for
sẽ dành cho, với điều kiện "Tôi không quan tâm thứ tự" nào mạnh mẽ hơn nữa, nếu nó được đưa vào tiêu chuẩn dưới một hình thức nào đó. Tất nhiên, nó cũng có thể có đường cú pháp dựa trên phạm vi :-)