std::reverse_copy
From cppreference.com
| ヘッダー <algorithm> で定義 |
||
| template< class BidirIt, class OutputIt > OutputIt reverse_copy( BidirIt first, BidirIt last, |
(1) | (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class BidirIt, class ForwardIt > ForwardIt reverse_copy( ExecutionPolicy&& policy, |
(2) | (C++17以降) |
1) N を std::distance(first, last) としたとき、範囲
[first, last) (ソース範囲) の要素を、d_first (宛先範囲) で始まる N 個の要素を持つ別の範囲に、宛先範囲の要素が逆順になるようにコピーします。 ソース範囲と宛先範囲が重複する場合、動作は未定義です。
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 | - | コピー先範囲の先頭 |
| 型要件 | ||
-BidirIt は LegacyBidirectionalIterator の要件を満たしている必要があります。 | ||
-OutputIt は LegacyOutputIterator の要件を満たさなければなりません。 | ||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。 | ||
[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.0 1.1 1.2 LegacyOutputIterator は、二項演算子
+および-をサポートする必要はありません。ここの+と-の使用は説明のためのものであり、実際の計算でそれらを使用する必要はありません。
[edit] See also
| 範囲内の要素の順序を逆にする (関数テンプレート) | |
| (C++20) |
逆順になった範囲のコピーを作成する (アルゴリズム関数オブジェクト) |