Namespaces
Variants

std::experimental::ranges:: BidirectionalIterator

From cppreference.net
template < class I >

concept bool BidirectionalIterator =
ForwardIterator < I > &&
DerivedFrom < ranges :: iterator_category_t < I > , ranges :: bidirectional_iterator_tag > &&
requires ( I i ) {
{ -- i } - > Same < I > & ;
{ i -- } - > Same < I > && ;

} ;
(ranges TS)

BidirectionalIterator<I> の概念は、 ForwardIterator を拡張し、イテレータを後方に移動する機能を追加します。

双方向イテレータ r は、ある s が存在して ++ s == r が成り立つ場合にのみ、 デクリメント可能 であると言います。すべてのデクリメント可能なイテレータ r は、式 -- r および r -- の定義域内になければなりません。

a b を型 I のデクリメント可能なオブジェクトとする。 BidirectionalIterator<I> は以下の条件を満たす場合にのみ成立する:

  • 前置デクリメントは被演算子を参照する左辺値を生成する: std:: addressof ( -- a ) == std:: addressof ( a )
  • 後置デクリメントは被演算子の以前の値を生成する:もし bool ( a == b ) ならば、 bool ( a -- == b ) となる。
  • 後置デクリメントと前置デクリメントは被演算子に対して同じ変更を実行する:もし bool ( a == b ) ならば、 a -- -- b の両方を評価した後でも、 bool ( a == b ) は依然として成立する。
  • インクリメントとデクリメントは互いに逆の操作である:
  • a がインクリメント可能であり、かつ bool ( a == b ) が成り立つ場合、 bool ( -- ( ++ a ) == b ) が成り立つ。
  • bool ( a == b ) が成り立つ場合、 bool ( ++ ( -- a ) == b ) が成り立つ。

等価性保存

式は、等しい入力が与えられた場合に等しい出力をもたらす場合、 equality preserving であると言います。

  • 式への入力は、そのオペランドで構成されます。
  • 式からの出力は、その結果と、式によって変更されたすべてのオペランド(存在する場合)で構成されます。

等価性を保持することが要求されるすべての式は、さらに stable(安定性) が要求されます:同じ入力オブジェクトに対するそのような式の2回の評価は、それらの入力オブジェクトに対する明示的な変更がない限り、等しい出力を持たなければなりません。

特に明記されていない限り、 requires式 で使用される各式は、等価性を保存し安定していることが要求され、式の評価は非定数オペランドのみを変更できます。定数オペランドは変更してはなりません。