Namespaces
Variants

C++ named requirements: LegacyRandomAccessIterator

From cppreference.net
C++ named requirements

LegacyRandomAccessIterator は、任意の要素を定数時間で指すように移動可能な LegacyBidirectionalIterator です。

LegacyRandomAccessIterator it Container に由来する場合、 it value_type はコンテナのものと同じであるため、デリファレンス( * it )によってコンテナの value_type が取得されます。

配列の要素へのポインタは、 LegacyRandomAccessIterator のすべての要件を満たします。

目次

要件

It は、以下の条件を満たす場合に LegacyRandomAccessIterator を満たします

そして、与えられた

  • value_type std:: iterator_traits < It > :: value_type で示される型
  • difference_type std:: iterator_traits < It > :: difference_type で示される型
  • reference std:: iterator_traits < It > :: reference で示される型
  • i a b It または const It 型のオブジェクト
  • r It 型の左辺値
  • n difference_type 型の整数

以下の式は有効であり、指定された効果を持たなければなりません:

**翻訳の説明:** - HTMLタグ、属性、C++コード部分(` `内)は完全に保持 - ` It `のみを「それ」に翻訳 - C++のキーワード(`return`など)、変数名(`i`, `n`, `temp`)、演算子は翻訳せず保持 - 元のフォーマットと構造を完全に維持
戻り値の型 操作的意味論 注記
r + = n It& difference_type m = n ;

if ( m >= 0 ) while ( m -- ) ++ r ;
else while ( m ++ ) -- r ;
return r ;

  • n は正または負のどちらでも可能
  • 計算量は定数(つまり、実装は操作意味論で示されたwhileループを実際に実行することはできない)
a + n

n + a

It It temp = a ;

return temp + = n ;

  • n は正または負のどちらでも可能
  • a + n == n + a
r - = n It& return r + = - n ; n の絶対値は difference_type の表現可能な値の範囲内でなければならない。
i - n それ It temp = i ;
return temp - = n ;
b - a difference_type return n ;
(前提条件を参照)

前提条件:

  • difference_type 型の値 n が存在し、 a + n == b を満たす

事後条件:

  • b == a + ( b - a ) .
i [ n ] reference に変換可能 * ( i + n )
a < b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
return b - a > 0 ; と等価 事前条件:
  • b - a と同じ

厳密な全順序関係:

  • ! ( a < a )
  • a < b ならば ! ( b < a )
  • a < b かつ b < c ならば a < c
  • a < b または b < a または a == b
    (これらの式のうち正確に1つが真)
a > b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
b < a a < b と逆の全順序関係
a >= b

BooleanTestable 要件を満たす

(C++20まで)

boolean-testable コンセプトをモデル化する

(C++20以降)
! ( a < b )
a <= b

BooleanTestable を満たす

(C++20まで)

boolean-testable をモデル化する

(C++20以降)
! ( a > b )

上記の規則は、 LegacyRandomAccessIterator LessThanComparable も実装することを意味します。

可変( mutable LegacyRandomAccessIterator は、追加で LegacyOutputIterator の要件を満たす LegacyRandomAccessIterator です。

Concept

std::iterator_traits の定義のために、以下の説明専用コンセプトが定義される。

template < class I >

concept __LegacyRandomAccessIterator =
__LegacyBidirectionalIterator < I > && std:: totally_ordered < I > &&
requires ( I i, typename std:: incrementable_traits < I > :: difference_type n )
{
{ i + = n } - > std:: same_as < I & > ;
{ i - = n } - > std:: same_as < I & > ;
{ i + n } - > std:: same_as < I > ;
{ n + i } - > std:: same_as < I > ;
{ i - n } - > std:: same_as < I > ;
{ i - i } - > std:: same_as < decltype ( n ) > ;
{ i [ n ] } - > std:: convertible_to < std:: iter_reference_t < I >> ;

} ;

ここで説明専用コンセプト __LegacyBidirectionalIterator LegacyBidirectionalIterator で説明されている。

(C++20以降)

不具合報告

以下の動作変更欠陥報告書は、以前に公開されたC++標準に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 299
( N3066 )
C++98 a [ n ] の戻り値型は
const value_type & への変換可能が要求されていた
戻り値型は
reference への変換可能が要求される
LWG 448 C++98 a [ n ] の戻り値型は
value_type への変換可能が要求されていた
戻り値型は
const value_type & への変換可能が要求される [1]
LWG 1079 C++98 b - a a < b を使用して定義され、
循環定義が生じていた
定義から a < b を削除
LWG 2114
( P2167R3 )
C++98 bool への変換可能性が実装の期待を反映するには弱すぎた 要件が強化された
  1. LWG issue 299 はこの解決後に再オープンされました。

関連項目

bidirectional_iterator がランダムアクセスイテレータであることを指定し、定数時間での前進と添字アクセスをサポートする
(コンセプト)
Iterator library イテレータ、イテレータ特性、アダプタ、およびユーティリティ関数の定義を提供する