Ежедневный бит (e) C++ # 222, альтернатива диапазону C++ 20 для counted_iterator: std::views::counted.

std::views::counted — это диапазон C++20, эквивалентный std::counted_iterator, который создает диапазон на основе итератора и количества элементов.

Подобно std::views::take, это представление также эффективно обрабатывает непрерывные диапазоны и диапазоны произвольного размера.

Для смежных диапазонов создается std::span; для диапазонов с произвольным доступом он разрешает конечный итератор.

#include <ranges>
#include <algorithm>
#include <vector>
#include <queue>

std::vector<int> data{1,2,3,4,5};

auto c = std::views::counted(data.begin(), 3);
// decltype(c) == std::span<int>
// c == {1,2,3}


std::deque<int> q{1,2,3,4,5};
auto random = std::views::counted(q.begin(), 3);
// random == {1,2,3}
// *random.end() == 4, O(1) operation


// More involed example:

// Preallocate space for three elements.
std::vector<int> top_three(3);  
// Produce the lowest three elements in top_three.
std::ranges::partial_sort_copy( 
    // From upto 5 integers read from the standard input.
    std::views::counted( 
        std::istream_iterator<int>(std::cin), 5),
    top_three
);
// For input: 13 97 42 7 666 1
// top_three == {7, 13, 42}

Откройте пример в Compiler Explorer.