Namespaces
Variants

std::ranges::reverse

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы на диапазонах (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Операции последовательностей без изменения    
Пакетные операции
(C++17)
Операции поиска
Операции изменения последовательностей
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции заполнения
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Операции сортировки и связанные с ними
Операции разбиения
(C++11)    

Операции сортировки
Операции двоичного поиска
(на разделенных диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для демонстрации*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные<memory>алгоритмы

Специализированные<random>алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имен std::ranges
Операции последовательностей без изменения
Операции изменения последовательностей
Операции разбиения
Операции сортировки
Операции двоичного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
       
       
Операции перестановок
Операции свертки
Операции над неинициализированной памятью
Типы возврата
 
Определен в заголовке <algorithm>
Сигнатура вызова
template< std::bidirectional_iterator I, std::sentinel_for<I> S >
requires std::permutable<I>
constexpr I
    reverse( I first, S last );
(1) (начиная с C++20)
template< ranges::bidirectional_range R >
requires std::permutable<ranges::iterator_t<R>>
constexpr ranges::borrowed_iterator_t<R>
    reverse( R&& r );
(2) (начиная с C++20)
1) Изменяет порядок элементов в диапазоне [first, last) на обратный.
Ведет себя так, как если бы применялся ranges::iter_swap к каждой паре итераторов first + i, last - i - 1 для каждого целого i, где 0 ≤ i < (last - first) / 2.
2) То же, что и (1), но использует r в качестве диапазона, как если бы ranges::begin(r) использовалось как first, а ranges::end(r) - как last.

Описанные на этой странице функции-подобные сущности являются объектами функций алгоритмов (неофициально известными как niebloids), то есть:

Параметры

first, last - пара итератор-страж, определяющая диапазон элементов для обращения
r - диапазон элементов для обращения

Возвращаемое значение

Итератор, равный last .

Сложность

Ровно ( last - first ) / 2 обменов.

Примечания

Реализации (например, MSVC STL ) могут использовать векторизацию, когда тип итератора моделирует contiguous_iterator и обмен его типа значений не вызывает ни нетривиальные специальные функции-члены, ни ADL -найденный swap .

Возможная реализация

Смотрите также реализации в libstdc++ и MSVC STL .

struct reverse_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S>
    requires std::permutable<I>
    constexpr I operator()(I first, S last) const
    {
        auto last2 {ranges::next(first, last)};
        for (auto tail {last2}; !(first == tail or first == --tail); ++first)
            ranges::iter_swap(first, tail);
        return last2;
    }
    template<ranges::bidirectional_range R>
    requires std::permutable<ranges::iterator_t<R>>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r) const
    {
        return (*this)(ranges::begin(r), ranges::end(r));
    }
};
inline constexpr reverse_fn reverse {};

Пример

#include <algorithm>
#include <array>
#include <iostream>
#include <string>
int main()
{
    std::string s {"ABCDEF"};
    std::cout << s << " → ";
    std::ranges::reverse(s.begin(), s.end());
    std::cout << s << " → ";
    std::ranges::reverse(s);
    std::cout << s << " │ ";
    std::array a {1, 2, 3, 4, 5};
    for (auto e : a)
        std::cout << e << ' ';
    std::cout << "→ ";
    std::ranges::reverse(a);
    for (auto e : a)
        std::cout << e << ' ';
    std::cout << '\n';
}

Вывод:

ABCDEF → FEDCBA → ABCDEF │ 1 2 3 4 5 → 5 4 3 2 1

Смотрите также

создает копию диапазона в обратном порядке
(функциональный объект алгоритма)
view , который итерирует по элементам другого двунаправленного представления в обратном порядке
(шаблон класса) (объект адаптера диапазона)
изменяет порядок элементов в диапазоне на обратный
(шаблон функции)