क्या कोई कंटेनर एडेप्टर है जो पुनरावृत्तियों की दिशा को उलट देगा, इसलिए मैं रेंज-आधारित फॉर-लूप के साथ एक कंटेनर पर उल्टा कर सकता हूं?
स्पष्ट पुनरावृत्तियों के साथ मैं इसे परिवर्तित करूंगा:
for (auto i = c.begin(); i != c.end(); ++i) { ...
इस मामले में:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
मैं इसे रूपांतरित करना चाहता हूं:
for (auto& i: c) { ...
इसके लिए:
for (auto& i: std::magic_reverse_adapter(c)) { ...
क्या ऐसी कोई बात है या मुझे इसे खुद लिखना है?
begin
करने के लिए end
, या स्ट्रीम iterators और तरह से निपटने के लिए। रेंज एल्गोरिदम बहुत अच्छा होगा, लेकिन वे वास्तव में सिंटैक्टिक शुगर हैं (इटेरियम एल्गोरिदम पर अधिक आलसी मूल्यांकन की संभावना को छोड़कर)।
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; };
इसमें सुधार किया जा सकता है ( const
संस्करण आदि जोड़ना ), लेकिन यह काम करता है: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
प्रिंट321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
तो फिर आप इसे पुन: उपयोग for(auto &i: reverse_adapt_container(v)) cout << i;
करने के लिए उपयोग कर सकते हैं ।
parallel_for
होगा जो इससे भी अधिक मजबूत होगा "मुझे परवाह नहीं है कि क्या आदेश" स्थिति है, अगर इसे किसी रूप में मानक में शामिल किया गया है। बेशक यह एक रेंज-आधारित सिंटैक्टिक शुगर भी हो सकता है :-)