名前空間
変種
操作

std::ranges::crend

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
ヘッダ <iterator> で定義
inline namespace /* 未指定 */ {

    inline constexpr /* 未指定 */ crend = /* 未指定 */;

}
(C++20以降)
(カスタマイズポイントオブジェクト)
呼び出しシグネチャ
template< class T >

    requires /* 以下を参照 */

constexpr /* 以下参照 */ auto crend( T&& t );
(C++20以降)

逆順シーケンスとして扱われる、定数イテレータのセンチネルを返します。(C++23 以降)(since C++23) (C++23 まで const 修飾された(until C++23)範囲のセンチネルを返します。

range-rbegin-rend.svg

CT を次のようにします。

  • 引数が左辺値(つまり、T が左辺値参照型)の場合、const std::remove_reference_t<T>&
  • それ以外の場合、const T

ranges::crend の呼び出しは、ranges::rend(static_cast<CT&&>(t)) と式として同等です。式と同等

(C++23まで)

引数が左辺値であるか、または ranges::enable_borrowed_range<std::remove_cv_t<T>>true の場合、ranges::crend の呼び出しは、

それ以外の場合、ranges::crend の呼び出しは不適格であり、テンプレートインスタント化の即時コンテキストで呼び出しが現れた場合に 置換失敗 を引き起こす可能性があります。

(C++23から)

e に対して ranges::crend(e) が有効である場合、ここで decltype((e))T です。そして、CTstd::ranges::range をモデル化し、(until C++23) std::sentinel_for<S, I> はすべての場合で true です。ここで Sdecltype(ranges::crend(e)) であり、Idecltype(ranges::crbegin(e)) です。 さらに、Sinput_iterator をモデル化する場合、constant-iterator をモデル化します。(since C++23)

カスタマイゼーションポイントオブジェクト

ranges::crend という名前は、関数オブジェクトで、const かつ リテラルsemiregular クラス型の *カスタマイズポイントオブジェクト* を指します。説明のために、その型の cv 修飾されていないバージョンは __crend_fn と表記されます。

__crend_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __crend_fn 型のインスタンスを呼び出す効果は、インスタンスを表す式が左辺値か右辺値か、const 修飾されているか否かに関わらず同等です(ただし、volatile 修飾されたインスタンスは呼び出し可能であることが要求されるわけではありません)。したがって、ranges::crend は自由にコピーでき、そのコピーは互換性があります。

Args... のセットが与えられた場合、std::declval<Args>()... が上記の ranges::crend への引数の要件を満たす場合、__crend_fn は以下をモデル化します。

それ以外の場合、__crend_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集]

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
 
int main()
{
    int a[]{4, 6, -3, 9, 10};
    std::cout << "Array backwards: ";
    namespace ranges = std::ranges;
    ranges::copy(ranges::rbegin(a), ranges::rend(a),
                 std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
 
    std::cout << "Vector backwards: ";
    std::vector v{4, 6, -3, 9, 10};
    ranges::copy(ranges::rbegin(v), ranges::rend(v),
                 std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

出力

Array backwards: 10 9 -3 6 4
Vector backwards: 10 9 -3 6 4

[編集] 関連項目

rangeへの逆終端イテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
(C++14)
コンテナまたは配列の逆順の終端イテレータを返す
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)