std::ranges::reverse
| ヘッダー <algorithm> で定義 |
||
| 呼び出しシグネチャ |
||
| template< std::bidirectional_iterator I, std::sentinel_for<I> S > requires std::permutable<I> |
(1) | (C++20以降) |
| template< ranges::bidirectional_range R > requires std::permutable<ranges::iterator_t<R>> |
(2) | (C++20以降) |
このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、
- これらのいずれかを呼び出す際に、明示的なテンプレート引数リストを指定することはできません。
- これらのいずれも実引数依存の名前探索には見えません。
- これらのいずれかが関数呼び出し演算子の左側の名前として通常の非修飾名探索によって見つかった場合、実引数依存の名前探索は抑制されます。
目次 |
[編集] Parameters
| first, last | - | <a href="/w/cpp/iterator#Ranges" title="cpp/iterator">範囲</a>を定義するイテレータ-センチネルペア。逆転させる要素の範囲を指定します。 |
| r | - | 逆転させる要素の範囲。 |
[編集] Return value
last と等しいイテレータ。
[編集] Complexity
正確に <code>(last - first) / 2</code> 回の交換。
[編集] Notes
イテレータ型が contiguous_iterator をモデル化し、その値型のスワップが自明でない特殊メンバ関数も ADL で見つかった swap も呼び出さない場合、実装 (例: MSVC STL) はベクトル化を有効にできる。
[編集] Possible implementation
<a rel="nofollow" class="external text" href="https://github.com/gcc-mirror/gcc/blob/14d8a5ae472ca5743016f37da2dd4770d83dea21/libstdc%2B%2B-v3/include/bits/ranges_algo.h#L1278-L1325">libstdc++</a> および <a rel="nofollow" class="external text" href="https://github.com/microsoft/STL/blob/472161105d596192194d4715ccad307c6c163b4a/stl/inc/algorithm#L4154-L4180">MSVC STL</a> の実装を参照してください。
struct reverse_fn { template<std::bidirectional_iterator I, std::sentinel_for<I> S> requires std::permutable<I> constexpr I operator()(I first, S last) const { auto last2 {ranges::next(first, last)}; for (auto tail {last2}; !(first == tail or first == --tail); ++first) ranges::iter_swap(first, tail); return last2; } template<ranges::bidirectional_range R> requires std::permutable<ranges::iterator_t<R>> constexpr ranges::borrowed_iterator_t<R> operator()(R&& r) const { return (*this)(ranges::begin(r), ranges::end(r)); } }; inline constexpr reverse_fn reverse {}; |
[編集] Example
#include <algorithm> #include <array> #include <iostream> #include <string> int main() { std::string s {"ABCDEF"}; std::cout << s << " → "; std::ranges::reverse(s.begin(), s.end()); std::cout << s << " → "; std::ranges::reverse(s); std::cout << s << " │ "; std::array a {1, 2, 3, 4, 5}; for (auto e : a) std::cout << e << ' '; std::cout << "→ "; std::ranges::reverse(a); for (auto e : a) std::cout << e << ' '; std::cout << '\n'; }
出力
ABCDEF → FEDCBA → ABCDEF │ 1 2 3 4 5 → 5 4 3 2 1
[編集] See also
| (C++20) |
逆順になった範囲のコピーを作成する (アルゴリズム関数オブジェクト) |
別の双方向viewの要素を逆順に反復処理する view(クラステンプレート) (rangeアダプタオブジェクト) | |
| 範囲内の要素の順序を逆にする (関数テンプレート) |