Aralık tabanlı for döngüsü ile tersine bir konteyner üzerinde yineleyebilmem için yineleyicilerin yönünü tersine çevirecek bir konteyner adaptörü var mı?
Açık yineleyiciler ile bunu dönüştürür:
for (auto i = c.begin(); i != c.end(); ++i) { ...
bunun içine:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Bunu dönüştürmek istiyorum:
for (auto& i: c) { ...
buna:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Böyle bir şey var mı yoksa kendim yazmak zorunda mıyım?
beginiçin end, veya akış Yineleyiciler ve benzeri başa çıkmak için. Aralık algoritmaları harika olurdu, ancak yineleyici algoritmaları üzerinde gerçekten sadece sözdizimsel şeker (tembel değerlendirme olasılığı hariç).
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; };Geliştirilebilir ( constsürüm ekleme , vb.) ama işe yarıyor: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;baskılar321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}O zaman sadece for(auto &i: reverse_adapt_container(v)) cout << i;yinelemek için kullanabilirsiniz .
parallel_for, bir şekilde standarda dahil edilmiş olsaydı, daha güçlü bir "hangi düzeni umursamıyorum" koşuluyla bunun için ne olurdu. Tabii ki aralık tabanlı bir sözdizimsel şeker de olabilir :-)