std::ranges::reverse_copy, std::ranges::reverse_copy_result
ja.cppreference.net より
| ヘッダ <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
関連項目
|
(C++20)
|
範囲内の要素の順序を反転する
(アルゴリズム関数オブジェクト) |
|
反転された範囲のコピーを作成する
(関数テンプレート) |