Ежедневный бит(e) C++ #250. Алгоритм реверсирования элементов в двунаправленном диапазоне.
Если мы хотим перебрать элементы двунаправленного диапазона в обратном порядке, нам не нужно его изменять.
Однако, если мы хотим изменить диапазон, мы можем использовать алгоритм std::reverse.
Обратите внимание, что std::list и std::forward_list предоставляют обратный метод, который меняет порядок узлов (вместо того, чтобы менять порядок значений).
#include <forward_list> #include <list> #include <vector> #include <algorithm> std::vector<int> data{1,2,3,4,5}; std::reverse(data.begin(), data.end()); // data == {5,4,3,2,1} std::list<int> lst1{1,2,3,4,5}; std::forward_list<int> lst2{1,2,3,4,5}; auto it1 = lst1.begin(); auto it2 = lst2.begin(); // Reverse method on list reverses nodes, instead of values lst1.reverse(); // lst1 == {5,4,3,2,1} // it1 != lst1.begin(), *it1 == 1 lst2.reverse(); // lst2 == {5,4,3,2,1} // it2 != lst2.begin(), *it2 == 1 // Only std::list models bidirectional range lst1 = {1,2,3,4,5}; it1 = lst1.begin(); std::reverse(lst1.begin(), lst1.end()); // lst1 == {5,4,3,2,1} // it1 == lst1.begin(), *it1 == 5
Откройте пример в Compiler Explorer.