std::counted_iterator is an iterator adaptor which behaves exactly like the underlying iterator, except that it keeps track of the distance to the end of its range. This iterator is equal to std::default_sentinel  if and only if its count reaches zero.
[edit] Member types
 Member type
 Definition
 iterator_type
 I
 iterator_concept
(conditionally present)
 I::iterator_concept if present; otherwise, not defined
 iterator_category
(conditionally present)
 I::iterator_category if present; otherwise, not defined
[edit] Member objects
 Member name
 Definition
 current (private)
 the underlying iterator which 
base() accesses
(exposition-only member object*)
 
 length (private)
 the distance between the underlying iterator and the end of its range
(exposition-only member object*)
[edit] Member functions
 
 constructs a new 
counted_iterator  (public member function) [edit] 
 
 
 assigns another 
counted_iterator  (public member function) [edit] 
 
 
 accesses the underlying iterator  
(public member function) [edit] 
 
 
 returns the distance to the end  
(public member function) [edit] 
 
 
 accesses the pointed-to element  
(public member function) [edit] 
 
 
 accesses an element by index  
(public member function) [edit] 
 
 
 advances or decrements the 
counted_iterator  (public member function) [edit] 
 
[edit] Non-member functions
 
 compares the distances to the end  
(function template) [edit] 
 
 
 checks if the distance to the end is equal to 
0  (function template) [edit] 
 
 
 advances the iterator  
(function template) [edit] 
 
 
 computes the distance between two iterator adaptors  
(function template) [edit] 
 
 
 computes the signed distance to the end  
(function template) [edit] 
 
 
 casts the result of dereferencing the underlying iterator to its associated rvalue reference type  
(function) [edit] 
 
 
 swaps the objects pointed to by two underlying iterators  
(function template) [edit] 
 
[edit] Helper classes
 
 provides uniform interface to the properties of the 
std::counted_iterator type  
(class template specialization) [edit] 
 
[edit] Example
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
 
using std::operator""s;
 
void print(auto const remark, auto const& v)
{
 const auto size = std::ssize (v);
 std::cout << remark << '[' << size << "] { ";
 for (auto it = std::counted_iterator{std::cbegin (v), size};
 it != std::default_sentinel ; ++it)
 std::cout << *it << (it.count() > 1 ? ", " : " ");
 std::cout << "}\n";
}
 
int main()
{
 const auto src = {"Arcturus"s, "Betelgeuse"s, "Canopus"s, "Deneb"s, "Elnath"s};
 print("src", src);
 std::vector <decltype(src)::value_type> dst;
 std::ranges::copy (std::counted_iterator{src.begin(), 3},
 std::default_sentinel,
 std::back_inserter (dst));
 print("dst", dst);
}Output:
src[5] { Arcturus, Betelgeuse, Canopus, Deneb, Elnath }
dst[3] { Arcturus, Betelgeuse, Canopus } 
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
[edit] See also
 
 default sentinel for use with iterators that know the bound of their range  
(class) [edit] 
 
 
 creates a subrange from an iterator and a count
(customization point object)[edit] 
 
 
 a 
view consisting of the first N elements of another 
view (class template) (range adaptor object)[edit]