名前空間
変種
操作

std::reverse_copy

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
reverse_copy
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <algorithm> で定義
template< class BidirIt, class OutputIt >

OutputIt reverse_copy( BidirIt first, BidirIt last,

                       OutputIt d_first );
(1) (C++20 以降 constexpr)
template< class ExecutionPolicy, class BidirIt, class ForwardIt >

ForwardIt reverse_copy( ExecutionPolicy&& policy,
                        BidirIt first, BidirIt last,

                        ForwardIt d_first );
(2) (C++17以降)
1) Nstd::distance(first, last) としたとき、範囲 [firstlast) (ソース範囲) の要素を、d_first (宛先範囲) で始まる N 個の要素を持つ別の範囲に、宛先範囲の要素が逆順になるようにコピーします。
i[0N) の整数である各 i について、 *(d_first + N - 1 - i) = *(first + i)[1] が実行されるかのように動作します。
ソース範囲と宛先範囲が重複する場合、動作は未定義です。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加します。

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>true です。

(C++20まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>true です。

(C++20以降)

目次

[edit] Parameters

first, last - コピーする要素のソース 範囲 を定義するイテレータペア
d_first - コピー先範囲の先頭
型要件
-
BidirItLegacyBidirectionalIterator の要件を満たしている必要があります。
-
OutputItLegacyOutputIterator の要件を満たさなければなりません。
-
ForwardItLegacyForwardIterator の要件を満たさなければなりません。

[edit] Return value

コピーされた最後の要素の次を指す出力イテレータ。

[edit] Complexity

正確に N 回の代入。

[edit] Exceptions

テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。

  • アルゴリズムの一部として呼び出された関数の実行が例外をスローし、ExecutionPolicy標準ポリシー のいずれかである場合、std::terminate が呼び出されます。その他の ExecutionPolicy の場合、動作は実装定義です。
  • アルゴリズムがメモリの割り当てに失敗した場合、std::bad_alloc がスローされます。

[edit] Possible implementation

libstdc++libc++、および MSVC STL の実装も参照してください。

template<class BidirIt, class OutputIt>
constexpr // since C++20
OutputIt reverse_copy(BidirIt first, BidirIt last, OutputIt d_first)
{
    for (; first != last; ++d_first)
        *d_first = *(--last);
    return d_first;
}

[edit] Notes

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

[edit] Example

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    auto print = [](const std::vector<int>& v)
    {
        for (const auto& value : v)
            std::cout << value << ' ';
        std::cout << '\n';
    };
 
    std::vector<int> v{1, 2, 3};
    print(v);
 
    std::vector<int> destination(3);
    std::reverse_copy(std::begin(v), std::end(v), std::begin(destination));
    print(destination);
 
    std::reverse_copy(std::rbegin(v), std::rend(v), std::begin(destination));
    print(destination);
}

出力

1 2 3 
3 2 1 
1 2 3

[edit] Defect reports

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2074 C++98 i の各々について、代入は
*(d_first + N - i) = *(first + i)[1]
に修正されました
*(d_first + N - 1 - i) = *(first + i)[1]
LWG 2150 C++98 1つの要素のみ代入が必要でした。 要件を修正しました。
  1. 1.0 1.1 1.2 LegacyOutputIterator は、二項演算子+および-をサポートする必要はありません。ここの+-の使用は説明のためのものであり、実際の計算でそれらを使用する必要はありません。

[edit] See also

範囲内の要素の順序を逆にする
(関数テンプレート) [編集]
逆順になった範囲のコピーを作成する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)