Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::bidire...nal_iterator(3) C++ Standard Libarystd::bidire...nal_iterator(3)

NAME
       std::bidirectional_iterator - std::bidirectional_iterator

Synopsis
	  Defined in header <iterator>
	  template<class I>

	  concept bidirectional_iterator =
	  std::forward_iterator<I> &&
	  std::derived_from</*ITER_CONCEPT*/<I>,
	  std::bidirectional_iterator_tag>				    &&
       (since C++20)
	  requires(I i)	{
	  { --i	} -> std::same_as<I&>;
	  { i--	} -> std::same_as<I>;

	  };

	  The  concept	bidirectional_iterator	refines	 forward_iterator   by
       adding the ability to
	  move an iterator backward.

	 Iterator concept determination

	  Definition of	this concept is	specified via an exposition-only alias
       template
	  /*ITER_CONCEPT*/.

	  In order to determine	/*ITER_CONCEPT*/<I>, let ITER_TRAITS<I>	denote
       I if the
	  specialization std::iterator_traits<I> is generated from the primary
       template, or
	  std::iterator_traits<I> otherwise:

	    * If ITER_TRAITS<I>::iterator_concept is valid and names a type,
	      /*ITER_CONCEPT*/<I> denotes the type.
	    *  Otherwise,  if  ITER_TRAITS<I>::iterator_category  is valid and
       names a type,
	      /*ITER_CONCEPT*/<I> denotes the type.
	    * Otherwise, if std::iterator_traits<I> is generated from the pri-
       mary template,
	      /*ITER_CONCEPT*/<I> denotes std::random_access_iterator_tag.
	    * Otherwise, /*ITER_CONCEPT*/<I> does not denote a	type  and  re-
       sults in	a
	      substitution failure.

	 Semantic requirements

	  A  bidirectional  iterator r is said to be decrementable if and only
       if there	exists
	  some s such that ++s == r.

	  bidirectional_iterator<I> is modeled only if	all  the  concepts  it
       subsumes	are
	  modeled, and given two objects a and b of type I:

	    * If a is decrementable, a is in the domain	of the expressions --a
       and a--.
	    *  Pre-decrement  yields  an  lvalue  that	refers to the operand:
       std::addressof(--a)
	      == std::addressof(a);
	    * Post-decrement yields the	previous  value	 of  the  operand:  if
       bool(a == b), then
	      bool(a-- == b).
	    *  Post-decrement  and pre-decrement perform the same modification
       on its operand:
	      If bool(a	== b), then after evaluating both a-- and --b,	bool(a
       == b) still
	      holds.
	    * Increment	and decrement are inverses of each other:

		     *	 If   a	 is  incrementable  and	 bool(a	 ==  b),  then
       bool(--(++a) == b).
		     *	If  a  is  decrementable  and  bool(a  ==   b),	  then
       bool(++(--a) == b).

	 Equality preservation

	  An  expression is equality preserving	if it results in equal outputs
       given equal
	  inputs.

	    * The inputs to an expression consist of its operands.
	    * The outputs of an	expression  consist  of	 its  result  and  all
       operands	modified by
	      the expression (if any).

	  In  specification  of	standard concepts, operands are	defined	as the
       largest
	  subexpressions that include only:

	    * an id-expression,	and
	    * invocations of std::move,	std::forward, and std::declval.

	  The cv-qualification and value category of each  operand  is	deter-
       mined by	assuming
	  that	each template type parameter denotes a cv-unqualified complete
       non-array object
	  type.

	  Every	expression required to be equality preserving is  further  re-
       quired to be
	  stable:  two	evaluations  of	such an	expression with	the same input
       objects must have
	  equal	outputs	absent any explicit intervening	modification of	 those
       input objects.

	  Unless  noted	otherwise, every expression used in a requires-expres-
       sion is required
	  to be	equality preserving and	stable,	and the	evaluation of the  ex-
       pression	may
	  modify  only	its  non-constant operands. Operands that are constant
       must not	be
	  modified.

Notes
	  Unlike the LegacyBidirectionalIterator  requirements,	 the  bidirec-
       tional_iterator
	  concept does not require dereference to return an lvalue.

See also
	  forward_iterator specifies that an input_iterator is a forward iter-
       ator, supporting
	  (C++20)	   equality comparison and multi-pass
			   (concept)

http://cppreference.com		  2022.07.31	 std::bidire...nal_iterator(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::bidirectional_iterator&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help