Daily bit(e) C++. std::views::counted

Добавлено 20 сентября 2023 в 08:35

Daily bit(e) C++ #222, альтернатива std::counted_iterator для диапазонов в C++20: std::views::counted.

Daily bit(e) C++

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.

Теги

C++ / CppC++20Daily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.