Ежедневный бит (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.