[iterator.synopsis] # 24 Iterators library [[iterators]](./#iterators) ## 24.2 Header synopsis [iterator.synopsis] [🔗](#header:%3citerator%3e) #include // see [[compare.syn]](compare.syn "17.12.1 Header synopsis")#include // see [[concepts.syn]](concepts.syn "18.3 Header synopsis")namespace std {template using *with-reference* = T&; // *exposition only*template concept [*can-reference*](#concept:can-reference "24.2 Header  synopsis [iterator.synopsis]") // *exposition only*= requires { typename *with-reference*; }; template concept [*dereferenceable*](#concept:dereferenceable "24.2 Header  synopsis [iterator.synopsis]") // *exposition only*= requires(T& t) {{ *t } -> [*can-reference*](#concept:can-reference "24.2 Header  synopsis [iterator.synopsis]"); // not required to be equality-preserving}; // [[iterator.assoc.types]](iterator.assoc.types "24.3.2 Associated types"), associated types// [[incrementable.traits]](incrementable.traits "24.3.2.1 Incrementable traits"), incrementable traitstemplate struct incrementable_traits; // freestandingtemplateusing iter_difference_t = *see below*; // freestanding// [[readable.traits]](readable.traits "24.3.2.2 Indirectly readable traits"), indirectly readable traitstemplate struct indirectly_readable_traits; // freestandingtemplateusing iter_value_t = *see below*; // freestanding// [[iterator.traits]](iterator.traits "24.3.2.3 Iterator traits"), iterator traitstemplate struct iterator_traits; // freestandingtemplate requires is_object_v struct iterator_traits; // freestandingtemplate<[*dereferenceable*](#concept:dereferenceable "24.2 Header  synopsis [iterator.synopsis]") T>using [iter_reference_t](#lib:iter_reference_t "24.2 Header  synopsis [iterator.synopsis]") = decltype(*declval()); // freestandingnamespace ranges {// [[iterator.cust]](iterator.cust "24.3.3 Customization point objects"), customization point objectsinline namespace *unspecified* {// [[iterator.cust.move]](iterator.cust.move "24.3.3.1 ranges​::​iter_­move"), ranges​::​iter_moveinline constexpr *unspecified* iter_move = *unspecified*; // freestanding// [[iterator.cust.swap]](iterator.cust.swap "24.3.3.2 ranges​::​iter_­swap"), ranges​::​iter_swapinline constexpr *unspecified* iter_swap = *unspecified*; // freestanding}}template<[*dereferenceable*](#concept:dereferenceable "24.2 Header  synopsis [iterator.synopsis]") T>requires requires(T& t) {{ ranges::iter_move(t) } -> [*can-reference*](#concept:can-reference "24.2 Header  synopsis [iterator.synopsis]"); }using [iter_rvalue_reference_t](#lib:iter_rvalue_reference_t "24.2 Header  synopsis [iterator.synopsis]") // freestanding= decltype(ranges::iter_move(declval())); // [[iterator.concepts]](iterator.concepts "24.3.4 Iterator concepts"), iterator concepts// [[iterator.concept.readable]](iterator.concept.readable "24.3.4.2 Concept indirectly_­readable"), concept [indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]")templateconcept indirectly_readable = *see below*; // freestanding// [[indirectcallable.traits]](indirectcallable.traits "24.3.6.2 Indirect callable traits"), indirect callable traitstemplate<[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") T>using *indirect-value-t* = *see below*; // *exposition only*template<[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") T>using [iter_common_reference_t](#lib:iter_common_reference_t "24.2 Header  synopsis [iterator.synopsis]") = // freestanding common_reference_t, *indirect-value-t*>; // [[iterator.concept.writable]](iterator.concept.writable "24.3.4.3 Concept indirectly_­writable"), concept [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_­writable [iterator.concept.writable]")templateconcept indirectly_writable = *see below*; // freestanding// [[iterator.concept.winc]](iterator.concept.winc "24.3.4.4 Concept weakly_­incrementable"), concept [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_­incrementable [iterator.concept.winc]")templateconcept weakly_incrementable = *see below*; // freestanding// [[iterator.concept.inc]](iterator.concept.inc "24.3.4.5 Concept incrementable"), concept [incrementable](iterator.concept.inc#concept:incrementable "24.3.4.5 Concept incrementable [iterator.concept.inc]")templateconcept incrementable = *see below*; // freestanding// [[iterator.concept.iterator]](iterator.concept.iterator "24.3.4.6 Concept input_­or_­output_­iterator"), concept [input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]")templateconcept input_or_output_iterator = *see below*; // freestanding// [[iterator.concept.sentinel]](iterator.concept.sentinel "24.3.4.7 Concept sentinel_­for"), concept [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]")templateconcept sentinel_for = *see below*; // freestanding// [[iterator.concept.sizedsentinel]](iterator.concept.sizedsentinel "24.3.4.8 Concept sized_­sentinel_­for"), concept [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]")templateconstexpr bool disable_sized_sentinel_for = false; // freestandingtemplateconcept sized_sentinel_for = *see below*; // freestanding// [[iterator.concept.input]](iterator.concept.input "24.3.4.9 Concept input_­iterator"), concept [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]")templateconcept input_iterator = *see below*; // freestanding// [[iterator.concept.output]](iterator.concept.output "24.3.4.10 Concept output_­iterator"), concept [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_­iterator [iterator.concept.output]")templateconcept output_iterator = *see below*; // freestanding// [[iterator.concept.forward]](iterator.concept.forward "24.3.4.11 Concept forward_­iterator"), concept [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_­iterator [iterator.concept.forward]")templateconcept forward_iterator = *see below*; // freestanding// [[iterator.concept.bidir]](iterator.concept.bidir "24.3.4.12 Concept bidirectional_­iterator"), concept [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_­iterator [iterator.concept.bidir]")templateconcept bidirectional_iterator = *see below*; // freestanding// [[iterator.concept.random.access]](iterator.concept.random.access "24.3.4.13 Concept random_­access_­iterator"), concept [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_­access_­iterator [iterator.concept.random.access]")templateconcept random_access_iterator = *see below*; // freestanding// [[iterator.concept.contiguous]](iterator.concept.contiguous "24.3.4.14 Concept contiguous_­iterator"), concept [contiguous_iterator](iterator.concept.contiguous#concept:contiguous_iterator "24.3.4.14 Concept contiguous_­iterator [iterator.concept.contiguous]")templateconcept contiguous_iterator = *see below*; // freestanding// [[indirectcallable]](indirectcallable "24.3.6 Indirect callable requirements"), indirect callable requirements// [[indirectcallable.indirectinvocable]](indirectcallable.indirectinvocable "24.3.6.3 Indirect callables"), indirect callablestemplateconcept indirectly_unary_invocable = *see below*; // freestandingtemplateconcept indirectly_regular_unary_invocable = *see below*; // freestandingtemplateconcept indirect_unary_predicate = *see below*; // freestandingtemplateconcept indirect_binary_predicate = *see below*; // freestandingtemplateconcept indirect_equivalence_relation = *see below*; // freestandingtemplateconcept indirect_strict_weak_order = *see below*; // freestandingtemplaterequires ([indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") && ...) && [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")...>using [indirect_result_t](#lib:indirect_result_t "24.2 Header  synopsis [iterator.synopsis]") = invoke_result_t...>; // freestanding// [[projected]](projected "24.3.6.4 Alias template projected"), projectedtemplate<[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") I, [indirectly_regular_unary_invocable](indirectcallable.indirectinvocable#concept:indirectly_regular_unary_invocable "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]") Proj>using projected = *see below*; // freestandingtemplate<[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") I, [indirectly_regular_unary_invocable](indirectcallable.indirectinvocable#concept:indirectly_regular_unary_invocable "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]") Proj>using projected_value_t = // freestanding remove_cvref_t&>>; // [[alg.req]](alg.req "24.3.7 Common algorithm requirements"), common algorithm requirements// [[alg.req.ind.move]](alg.req.ind.move "24.3.7.2 Concept indirectly_­movable"), concept [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_­movable [alg.req.ind.move]")templateconcept indirectly_movable = *see below*; // freestandingtemplateconcept indirectly_movable_storable = *see below*; // freestanding// [[alg.req.ind.copy]](alg.req.ind.copy "24.3.7.3 Concept indirectly_­copyable"), concept [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_­copyable [alg.req.ind.copy]")templateconcept indirectly_copyable = *see below*; // freestandingtemplateconcept indirectly_copyable_storable = *see below*; // freestanding// [[alg.req.ind.swap]](alg.req.ind.swap "24.3.7.4 Concept indirectly_­swappable"), concept [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_­swappable [alg.req.ind.swap]")templateconcept indirectly_swappable = *see below*; // freestanding// [[alg.req.ind.cmp]](alg.req.ind.cmp "24.3.7.5 Concept indirectly_­comparable"), concept [indirectly_comparable](alg.req.ind.cmp#concept:indirectly_comparable "24.3.7.5 Concept indirectly_­comparable [alg.req.ind.cmp]")templateconcept indirectly_comparable = *see below*; // freestanding// [[alg.req.permutable]](alg.req.permutable "24.3.7.6 Concept permutable"), concept [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")templateconcept permutable = *see below*; // freestanding// [[alg.req.mergeable]](alg.req.mergeable "24.3.7.7 Concept mergeable"), concept [mergeable](alg.req.mergeable#concept:mergeable "24.3.7.7 Concept mergeable [alg.req.mergeable]")templateconcept mergeable = *see below*; // freestanding// [[alg.req.sortable]](alg.req.sortable "24.3.7.8 Concept sortable"), concept [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")templateconcept sortable = *see below*; // freestanding// [[iterator.primitives]](iterator.primitives "24.4 Iterator primitives"), primitives// [[std.iterator.tags]](std.iterator.tags "24.4.2 Standard iterator tags"), iterator tagsstruct input_iterator_tag { }; // freestandingstruct output_iterator_tag { }; // freestandingstruct forward_iterator_tag: public input_iterator_tag { }; // freestandingstruct bidirectional_iterator_tag: public forward_iterator_tag { }; // freestandingstruct random_access_iterator_tag: public bidirectional_iterator_tag { }; // freestandingstruct contiguous_iterator_tag: public random_access_iterator_tag { }; // freestanding// [[iterator.operations]](iterator.operations "24.4.3 Iterator operations"), iterator operationstemplateconstexpr void advance(InputIterator& i, Distance n); // freestandingtemplateconstexpr typename iterator_traits::difference_type distance(InputIterator first, InputIterator last); // freestandingtemplateconstexpr InputIterator next(InputIterator x, // freestandingtypename iterator_traits::difference_type n = 1); templateconstexpr BidirectionalIterator prev(BidirectionalIterator x, // freestandingtypename iterator_traits::difference_type n = 1); // [[range.iter.ops]](range.iter.ops "24.4.4 Range iterator operations"), range iterator operationsnamespace ranges {// [[range.iter.op.advance]](range.iter.op.advance "24.4.4.2 ranges​::​advance"), ranges​::​advancetemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I>constexpr void advance(I& i, iter_difference_t n); // freestandingtemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S>constexpr void advance(I& i, S bound); // freestandingtemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S>constexpr iter_difference_t advance(I& i, iter_difference_t n, // freestanding S bound); // [[range.iter.op.distance]](range.iter.op.distance "24.4.4.3 ranges​::​distance"), ranges​::​distancetemplate S>requires (![sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"))constexpr iter_difference_t distance(I first, S last); // freestandingtemplate> S>constexpr iter_difference_t> distance(I&& first, S last); // freestandingtemplate<[range](range.range#concept:range "25.4.2 Ranges [range.range]") R>constexpr range_difference_t distance(R&& r); // freestanding// [[range.iter.op.next]](range.iter.op.next "24.4.4.4 ranges​::​next"), ranges​::​nexttemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I>constexpr I next(I x); // freestandingtemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I>constexpr I next(I x, iter_difference_t n); // freestandingtemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S>constexpr I next(I x, S bound); // freestandingtemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S>constexpr I next(I x, iter_difference_t n, S bound); // freestanding// [[range.iter.op.prev]](range.iter.op.prev "24.4.4.5 ranges​::​prev"), ranges​::​prevtemplate<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_­iterator [iterator.concept.bidir]") I>constexpr I prev(I x); // freestandingtemplate<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_­iterator [iterator.concept.bidir]") I>constexpr I prev(I x, iter_difference_t n); // freestandingtemplate<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_­iterator [iterator.concept.bidir]") I>constexpr I prev(I x, iter_difference_t n, I bound); // freestanding}// [[predef.iterators]](predef.iterators "24.5 Iterator adaptors"), predefined iterators and sentinels// [[reverse.iterators]](reverse.iterators "24.5.1 Reverse iterators"), reverse iteratorstemplate class reverse_iterator; // freestandingtemplateconstexpr bool operator==( // freestandingconst reverse_iterator& x, const reverse_iterator& y); templateconstexpr bool operator!=( // freestandingconst reverse_iterator& x, const reverse_iterator& y); templateconstexpr bool operator<( // freestandingconst reverse_iterator& x, const reverse_iterator& y); templateconstexpr bool operator>( // freestandingconst reverse_iterator& x, const reverse_iterator& y); templateconstexpr bool operator<=( // freestandingconst reverse_iterator& x, const reverse_iterator& y); templateconstexpr bool operator>=( // freestandingconst reverse_iterator& x, const reverse_iterator& y); template Iterator2>constexpr compare_three_way_result_toperator<=>(const reverse_iterator& x, // freestandingconst reverse_iterator& y); templateconstexpr auto operator-( // freestandingconst reverse_iterator& x, const reverse_iterator& y) -> decltype(y.base() - x.base()); templateconstexpr reverse_iterator operator+( // freestanding iter_difference_t n, const reverse_iterator& x); templateconstexpr reverse_iterator make_reverse_iterator(Iterator i); // freestandingtemplaterequires (![sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"))constexpr bool disable_sized_sentinel_for, // freestanding reverse_iterator> = true; // [[insert.iterators]](insert.iterators "24.5.2 Insert iterators"), insert iteratorstemplate class back_insert_iterator; // freestandingtemplateconstexpr back_insert_iterator back_inserter(Container& x); // freestandingtemplate class front_insert_iterator; // freestandingtemplateconstexpr front_insert_iterator front_inserter(Container& x); // freestandingtemplate class insert_iterator; // freestandingtemplateconstexpr insert_iterator inserter(Container& x, ranges::iterator_t i); // freestanding// [[const.iterators]](const.iterators "24.5.3 Constant iterators and sentinels"), constant iterators and sentinels// [[const.iterators.alias]](const.iterators.alias "24.5.3.2 Alias templates"), alias templatestemplate<[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_­readable [iterator.concept.readable]") I>using iter_const_reference_t = *see below*; // freestandingtemplateconcept [*constant-iterator*](const.iterators.alias#concept:constant-iterator "24.5.3.2 Alias templates [const.iterators.alias]") = *see below*; // *exposition only*template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") I>using const_iterator = *see below*; // freestandingtemplate<[semiregular](concepts.object#concept:semiregular "18.6 Object concepts [concepts.object]") S>using const_sentinel = *see below*; // freestanding// [[const.iterators.iterator]](const.iterators.iterator "24.5.3.3 Class template basic_­const_­iterator"), class template basic_const_iteratortemplate<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") Iterator>class basic_const_iterator; // freestandingtemplate U>requires [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]")>struct common_type, U> { // freestandingusing type = basic_const_iterator>; }; template U>requires [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]")>struct common_type> { // freestandingusing type = basic_const_iterator>; }; template U>requires [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]")>struct common_type, basic_const_iterator> { // freestandingusing type = basic_const_iterator>; }; template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") I>constexpr const_iterator [make_const_iterator](#lib:make_const_iterator "24.2 Header  synopsis [iterator.synopsis]")(I it) { return it; } // freestandingtemplate<[semiregular](concepts.object#concept:semiregular "18.6 Object concepts [concepts.object]") S>constexpr const_sentinel [make_const_sentinel](#lib:make_const_sentinel "24.2 Header  synopsis [iterator.synopsis]")(S s) { return s; } // freestanding// [[move.iterators]](move.iterators "24.5.4 Move iterators and sentinels"), move iterators and sentinelstemplate class move_iterator; // freestandingtemplateconstexpr bool operator==( // freestandingconst move_iterator& x, const move_iterator& y); templateconstexpr bool operator<( // freestandingconst move_iterator& x, const move_iterator& y); templateconstexpr bool operator>( // freestandingconst move_iterator& x, const move_iterator& y); templateconstexpr bool operator<=( // freestandingconst move_iterator& x, const move_iterator& y); templateconstexpr bool operator>=( // freestandingconst move_iterator& x, const move_iterator& y); template Iterator2>constexpr compare_three_way_result_toperator<=>(const move_iterator& x, // freestandingconst move_iterator& y); templateconstexpr auto operator-( // freestandingconst move_iterator& x, const move_iterator& y)-> decltype(x.base() - y.base()); templateconstexpr move_iteratoroperator+(iter_difference_t n, const move_iterator& x); // freestandingtemplateconstexpr move_iterator make_move_iterator(Iterator i); // freestandingtemplaterequires (![sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_­sentinel_­for [iterator.concept.sizedsentinel]"))constexpr bool disable_sized_sentinel_for, // freestanding move_iterator> = true; template<[semiregular](concepts.object#concept:semiregular "18.6 Object concepts [concepts.object]") S> class move_sentinel; // freestanding// [[iterators.common]](iterators.common "24.5.5 Common iterators"), common iteratorstemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_­for [iterator.concept.sentinel]") S>requires (![same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]") && [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]"))class common_iterator; // freestandingtemplatestruct incrementable_traits>; // freestandingtemplate<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") I, class S>struct iterator_traits>; // freestanding// [[default.sentinel]](default.sentinel "24.5.6 Default sentinel"), default sentinelstruct default_sentinel_t; // freestandinginline constexpr default_sentinel_t [default_sentinel](#lib:default_sentinel "24.2 Header  synopsis [iterator.synopsis]"){}; // freestanding// [[iterators.counted]](iterators.counted "24.5.7 Counted iterators"), counted iteratorstemplate<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_­or_­output_­iterator [iterator.concept.iterator]") I> class counted_iterator; // freestandingtemplate<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_­iterator [iterator.concept.input]") I>requires *see below*struct iterator_traits>; // freestanding// [[unreachable.sentinel]](unreachable.sentinel "24.5.8 Unreachable sentinel"), unreachable sentinelstruct unreachable_sentinel_t; // freestandinginline constexpr unreachable_sentinel_t [unreachable_sentinel](#lib:unreachable_sentinel "24.2 Header  synopsis [iterator.synopsis]"){}; // freestanding// [[stream.iterators]](stream.iterators "24.6 Stream iterators"), stream iteratorstemplate, class Distance = ptrdiff_t>class istream_iterator; templatebool operator==(const istream_iterator& x, const istream_iterator& y); template>class ostream_iterator; template>class istreambuf_iterator; templatebool operator==(const istreambuf_iterator& a, const istreambuf_iterator& b); template>class ostreambuf_iterator; // [[iterator.range]](iterator.range "24.7 Range access"), range accesstemplate constexpr auto begin(C& c) -> decltype(c.begin()); // freestandingtemplate constexpr auto begin(const C& c) -> decltype(c.begin()); // freestandingtemplate constexpr auto end(C& c) -> decltype(c.end()); // freestandingtemplate constexpr auto end(const C& c) -> decltype(c.end()); // freestandingtemplate constexpr T* begin(T (&array)[N]) noexcept; // freestandingtemplate constexpr T* end(T (&array)[N]) noexcept; // freestandingtemplate constexpr auto cbegin(const C& c) // freestandingnoexcept(noexcept(std::begin(c))) -> decltype(std::begin(c)); template constexpr auto cend(const C& c) // freestandingnoexcept(noexcept(std::end(c))) -> decltype(std::end(c)); template constexpr auto rbegin(C& c) -> decltype(c.rbegin()); // freestandingtemplate constexpr auto rbegin(const C& c) -> decltype(c.rbegin()); // freestandingtemplate constexpr auto rend(C& c) -> decltype(c.rend()); // freestandingtemplate constexpr auto rend(const C& c) -> decltype(c.rend()); // freestandingtemplate constexpr reverse_iterator rbegin(T (&array)[N]) // freestandingtemplate constexpr reverse_iterator rend(T (&array)[N]); // freestandingtemplate constexpr reverse_iterator rbegin(initializer_list il); // freestandingtemplate constexpr reverse_iterator rend(initializer_list il); // freestandingtemplate constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // freestandingtemplate constexpr auto crend(const C& c) -> decltype(std::rend(c)); // freestandingtemplate constexpr auto size(const C& c) -> decltype(c.size()); // freestandingtemplate constexpr size_t size(const T (&array)[N]) noexcept; // freestandingtemplate constexpr auto ssize(const C& c)-> common_type_t>; // freestandingtemplate constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // freestandingtemplate constexpr auto empty(const C& c) -> decltype(c.empty()); // freestandingtemplate constexpr bool empty(const T (&array)[N]) noexcept; // freestandingtemplate constexpr bool empty(initializer_list il) noexcept; // freestandingtemplate constexpr auto data(C& c) -> decltype(c.data()); // freestandingtemplate constexpr auto data(const C& c) -> decltype(c.data()); // freestandingtemplate constexpr T* data(T (&array)[N]) noexcept; // freestandingtemplate constexpr const E* data(initializer_list il) noexcept; // freestanding}