Scroll to navigation

std::counted_iterator(3) C++ Standard Libary std::counted_iterator(3)

NAME

std::counted_iterator - std::counted_iterator

Synopsis


Defined in header <iterator>
template< std::input_or_output_iterator I > (since C++20)
class counted_iterator;


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.

Member types


Member type Definition
iterator_type I
value_type std::iter_value_t<I> if I models indirectly_readable; otherwise,
not defined
difference_type std::iter_difference_t<I>
iterator_concept I::iterator_concept if present; otherwise, not defined
iterator_category I::iterator_category if present; otherwise, not defined

Member objects


Member name Definition
current (private) the underlying iterator which base() accesses
(exposition-only member object*)
the distance between the underlying iterator and the end of its
length (private) range
(exposition-only member object*)

Member functions


constructor constructs a new iterator adaptor
(C++20) (public member function)
operator= assigns another iterator adaptor
(C++20) (public member function)
base accesses the underlying iterator
(C++20) (public member function)
count returns the distance to the end
(C++20) (public member function)
operator* accesses the pointed-to element
operator-> (public member function)
(C++20)
operator[] accesses an element by index
(C++20) (public member function)
operator++
operator++(int)
operator+=
operator+ advances or decrements the iterator
operator-- (public member function)
operator--(int)
operator-=
operator-
(C++20)

Non-member functions


operator== compares the distances to the end
operator<=> (function template)
(C++20)
operator==(std::default_sentinel) checks if the distance to the end is equal to 0
(C++20) (function template)
operator+ advances the iterator
(C++20) (function template)
operator- computes the distance between two iterator
(C++20) adaptors
(function template)
operator-(std::default_sentinel_t) computes the signed distance to the end
(C++20) (function template)
iter_move casts the result of dereferencing the underlying
(C++20) iterator to its associated rvalue reference type
(function)
iter_swap swaps the objects pointed to by two underlying
(C++20) iterators
(function template)

Helper classes


provides uniform interface to the
std::iterator_traits<std::counted_iterator> properties of the std::counted_iterator
(C++20) type
(class template specialization)

Example

// Run this code


#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 }


Defect reports


The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.


DR Applied to Behavior as published Correct behavior
member typedefs are not provided member typedefs are added to
std::incrementable_traits account for iterator_traits fix
P2259R1 C++20 is specialized for redundant
counted_iterator std::incrementable_traits
specialization is removed

See also


default_sentinel_t default sentinel for use with iterators that know the bound of
(C++20) their range
(class)
views::counted creates a subrange from an iterator and a count
(C++20) (customization point object)
ranges::take_view a view consisting of the first N elements of another view
views::take (class template) (range adaptor object)
(C++20)

2024.06.10 http://cppreference.com