এমন একটি ধারক অ্যাডাপ্টার রয়েছে যা পুনরাবৃত্তির দিককে বিপরীত করবে যাতে আমি ল্যাপের সাথে রেঞ্জ-ভিত্তিক বিপরীতে কোনও ধারককে পুনরাবৃত্তি করতে পারি?
সুস্পষ্ট পুনরাবৃত্তির সাথে আমি এটি রূপান্তর করব:
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
জন্য হবে একটি এমনকি আরো শক্তিশালী সঙ্গে "আমি কেয়ার করি না কি অর্ডার" শর্ত, যদি কোন না কোনভাবে মান অন্তর্ভুক্ত করা হয়। অবশ্যই এটিতে একটি পরিসীমা ভিত্তিক সিনট্যাকটিক চিনিও থাকতে পারে :-)