Namespaces
Variants

std::ranges::reverse

ja.cppreference.net から
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に対するアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対する)
集合操作 (ソート済み範囲に対する)
マージ操作 (ソート済み範囲に対する)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
制約付きアルゴリズム
このメニュー内のすべての名前は名前空間 std::ranges
非変更シーケンス操作
変更シーケンス操作
分割操作
ソート操作
二分探索操作 (ソート済み範囲に対する)
       
       
集合操作 (ソート済み範囲に対する)
ヒープ操作
最小値/最大値操作
       
       
順列操作
畳み込み操作
数値操作
(C++23)            
未初期化ストレージに対する操作
戻り値の型
 
ヘッダ <algorithm>
で定義
template< std::bidirectional_iterator I, std::sentinel_for<I> S >
requires std::permutable<I>
constexpr I
    reverse( I first, S last );
呼び出しシグネチャ (1)
template< ranges::bidirectional_range R >
requires std::permutable<ranges::iterator_t<R>>
constexpr ranges::borrowed_iterator_t<R>
    reverse( R&& r );
(C++20 以降) (2)
(C++20 以降)1)[first, last) 範囲
内の要素の順序を反転させる。 あたかも、各整数 に対してイテレータのペア 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 {};
**注記**: 指定された要件に従い、HTMLタグ、属性、および``、`
`、``タグ内のテキスト(この場合はC++コード全体)は翻訳せず、元のフォーマットを保持しています。C++固有の用語も翻訳対象外としました。

例

#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
(クラステンプレート) (レンジアダプタオブジェクト)
範囲内の要素の順序を反転する
(関数テンプレート)