Apakah ada adaptor wadah yang akan membalikkan arah iterator sehingga saya dapat beralih di atas wadah secara terbalik dengan range-for-loop berbasis?
Dengan iterator eksplisit saya akan mengonversi ini:
for (auto i = c.begin(); i != c.end(); ++i) { ...
dalam hal ini:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Saya ingin mengonversi ini:
for (auto& i: c) { ...
untuk ini:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Apakah ada hal seperti itu atau saya harus menulisnya sendiri?
begin
ke end
, atau untuk berurusan dengan iterator aliran dan sejenisnya. Algoritme rentang akan menjadi besar, tetapi mereka benar-benar hanya gula sintaksis (kecuali untuk kemungkinan evaluasi malas) atas algoritma iterator.
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; };
Dapat ditingkatkan (menambahkan const
versi, dll) tetapi berfungsi: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
mencetak321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
Jadi Anda bisa menggunakannya for(auto &i: reverse_adapt_container(v)) cout << i;
untuk beralih.
parallel_for
akan terjadi, dengan kondisi "Saya tidak peduli urutan apa" yang lebih kuat, jika dimasukkan ke dalam standar dalam beberapa bentuk. Tentu saja bisa memiliki gula sintaksis berbasis rentang juga :-)