Чи є адаптер контейнера, який би змінював напрямок ітераторів, щоб я міг перебирати контейнер у зворотному напрямку з циклом для циклу?
З явними ітераторами я би перетворив це:
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
, або для роботи з потоковими ітератори тощо. Алгоритми діапазону були б чудовими, але вони справді просто синтаксичний цукор (за винятком можливості лінивої оцінки) над алгоритмами ітератора.
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
було б, з ще сильнішою умовою "Мені все одно, який порядок", якби вона була включена до стандарту в якійсь формі. Звичайно, у нього може бути і синтаксичний цукор на основі діапазону :-)