Ежедневный бит(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.