Daily bit(e) C++. std::views::counted
Daily bit(e) C++ #222, альтернатива std::counted_iterator
для диапазонов в C++20: std::views::counted
.
std::views::counted
– это эквивалент std::counted_iterator
для диапазонов в C++20, создающий диапазон из итератора и количества элементов.
Подобно 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)
// Более сложный пример:
// Предварительно выделяем место для трех элементов.
std::vector<int> top_three(3);
// Создаем три элемента в top_three с наименьшими значениями
std::ranges::partial_sort_copy(
// из 5 целых чисел, считанных со стандартного ввода
std::views::counted(
std::istream_iterator<int>(std::cin), 5),
top_three
);
// Для ввода: 13 97 42 7 666 1
// top_three == {7, 13, 42}
Открыть пример на Compiler Explorer.