std::counte...ted_iterator(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

Okay so this page is std::counte...ted_iterator(3) from the C++ Standard Libary, and the NAME section says it twice: std::counted_iterator::counted_iterator β€” yes, bestie, it's the constructor for the counted iterator adaptor. The original NAME line is literally std::counted_iterator::counted_iterator - std::counted_iterator::counted_iterator, so we're keeping that double-name energy. πŸ’…βœ¨

✨ Synopsis ✨

Here are the three constructor forms, all marked (since C++20) in the original:

  • (1) (since C++20) β€” default constructor vibes:
constexpr counted_iterator() requires std::default_initializable<I> = default;
  • (2) (since C++20) β€” iterator plus length:
constexpr counted_iterator( I x, std::iter_difference_t<I> n );
  • (3) (since C++20) β€” converting constructor:
template< class I2 >
    requires std::convertible_to<const I2&, I>
constexpr counted_iterator( const counted_iterator<I2>& other );

Constructs a new iterator adaptor. That's the whole job, and it's iconic. 🫢

  1. (1) Default constructor. Value-initializes the underlying iterator and initialized the underlying length with 0. Operations on the resulting iterator have defined behavior if and only if the corresponding operations on a value-initialized I also have defined behavior. 🌸
  2. (2) The underlying iterator is initialized with std::move(x) and the underlying length is initialized with n. The behavior is undefined if n is negative. 🚨 Like, do not pass a negative n, fr fr.
  3. (3) The underlying iterator and length are initialized with those of other. Slay, conversion. πŸ’«

πŸŽ€ Parameters πŸŽ€

  • x β€” iterator to adapt
  • n β€” distance to the end
  • other β€” iterator adaptor to convert

🌸 Example 🌸

The page has a // Run this code line before the block, so go run it bestie:

#include <algorithm>
#include <initializer_list>
#include <iostream>
#include <iterator>

int main()
{
    static constexpr auto pi = {3, 1, 4, 1, 5, 9, 2};

    // (1) default constructor:
    constexpr
    std::counted_iterator<std::initializer_list<int>::iterator> i1{};
    static_assert(i1 == std::default_sentinel);
    static_assert(i1.count() == 0);

    // (2) initializes the iterator and length respectively:
    constexpr
    std::counted_iterator<std::initializer_list<int>::iterator> i2{
        pi.begin(), pi.size() - 2
    };
    static_assert(i2.count() == 5);
    static_assert(*i2 == 3 && i2[1] == 1);

    // (3) converting-constructor:
    std::counted_iterator<std::initializer_list<const int>::iterator>
    i3{i2};

    std::ranges::copy(i3, std::default_sentinel,
        std::ostream_iterator<const int>{std::cout, " "});
}

πŸ¦‹ Output πŸ¦‹

3 1 4 1 5

πŸ’… See also πŸ’…

  • operator= β€” assigns another iterator adaptor; (C++20) (public member function) πŸ‘‘

That's the whole page, bestie πŸ’–. Source/version vibes: http://cppreference.com, dated 2024.06.10. Go construct something iconic 🫢✨

πŸ“¦ where this page comes from