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?
begin
iç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 ( const
sü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 :-)