Namespaces
Variants

std::ranges::reverse_copy, std::ranges::reverse_copy_result

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,
          std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr reverse_copy_result<I, O>
    reverse_copy( I first, S last, O result );
(1) (C++20 以降)
template< ranges::bidirectional_range R, std::weakly_incrementable O >
requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
    reverse_copy( R&& r, O result );
(2) (C++20 以降)
ヘルパー型
template< class I, class O >
using reverse_copy_result = ranges::in_out_result<I, O>;
(3) (C++20 以降)
1) ソース範囲 [first, last) の要素をデスティネーション範囲 [result, result + N) にコピーします。ここで N は ranges::distance(first, last) です。新しい範囲の要素が逆順になるようにコピーします。代入 *(result + N - 1 - i) = *(first + i) が i の各整数 [0, N) に対して一度ずつ実行されるかのように振る舞います。ソース範囲とデスティネーション範囲が重なる場合の動作は未定義です。
2) (1) と同じですが、ソース範囲として r を使用します。あたかも ranges::begin(r) を first として、ranges::end(r) を last として使用するかのように振る舞います。

このページで説明されている関数のようなエンティティは アルゴリズム関数オブジェクト (非公式には ニブロイド として知られています) であり、すなわち:

パラメータ

first, last - コピーする要素のソース 範囲 を定義するイテレータ-センチネルペア
r - コピーする要素のソース範囲
result - コピー先範囲の先頭

戻り値

{ last, result + N } .

計算量

正確に N 個の課題。

注記

実装(例: MSVC STL )は、両方のイテレータ型が contiguous_iterator をモデル化し、同じ値型を持ち、かつ値型が TriviallyCopyable である場合にベクトル化を有効化することがあります。

実装例

実装については MSVC STL および libstdc++ も参照してください。

struct reverse_copy_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S,
             std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::reverse_copy_result<I, O>
        operator()(I first, S last, O result) const
    {
        auto ret = ranges::next(first, last);
        for (; last != first; *result = *--last, ++result);
        return {std::move(ret), std::move(result)};
    }
    template<ranges::bidirectional_range R, std::weakly_incrementable O>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::reverse_copy_result<ranges::borrowed_iterator_t<R>, O>
        operator()(R&& r, O result) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
    }
};
inline constexpr reverse_copy_fn reverse_copy {};

例

#include <algorithm>
#include <iostream>
#include <string>
int main()
{
    std::string x {"12345"}, y(x.size(), ' ');
    std::cout << x << " → ";
    std::ranges::reverse_copy(x.begin(), x.end(), y.begin());
    std::cout << y << " → ";
    std::ranges::reverse_copy(y, x.begin());
    std::cout << x << '\n';
}

出力:

12345 → 54321 → 12345

関連項目

範囲内の要素の順序を反転する
(アルゴリズム関数オブジェクト)
反転された範囲のコピーを作成する
(関数テンプレート)