std::ranges::reverse_copy, std::ranges::reverse_copy_result
From cppreference.com
| ヘッダー <algorithm> で定義 |
||
| 呼び出しシグネチャ |
||
| template< std::bidirectional_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O > |
(1) | (C++20以降) |
| template< ranges::bidirectional_range R, std::weakly_incrementable O > requires std::indirectly_copyable<ranges::iterator_t<R>, O> |
(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) です。要素は新しい範囲で逆順になるようにコピーされます。これは、[0, N) の各整数 i に対して、*(result + N - 1 - i) = *(first + i) の代入を実行するのと同等に動作します。ソース範囲と宛先範囲が重複する場合、動作は未定義です。このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、
- これらのいずれかを呼び出す際に、明示的なテンプレート引数リストを指定することはできません。
- これらのいずれも実引数依存の名前探索には見えません。
- これらのいずれかが関数呼び出し演算子の左側の名前として通常の非修飾名探索によって見つかった場合、実引数依存の名前探索は抑制されます。
目次 |
[edit] パラメータ
| first, last | - | コピーする要素のソース 範囲 を定義するイテレータとセンチネルのペア |
| r | - | コピーする要素のソース範囲 |
| 結果 | - | 宛先範囲の開始位置。 |
[edit] 戻り値
{last, result + N}.
[edit] 計算量
正確に N 回の代入。
[edit] 注記
実装 (例: MSVC STL) は、両方のイテレータ型が contiguous_iterator をモデル化し、同じ値型を持ち、その値型が TriviallyCopyable である場合に、ベクトル化を有効にする可能性があります。
[edit] 可能な実装
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 {}; |
[edit] 例
このコードを実行
#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
[edit] 関連項目
| (C++20) |
範囲内の要素の順序を逆にする (アルゴリズム関数オブジェクト) |
| 逆順になった範囲のコピーを作成する (関数テンプレート) |