range-v3
Библиотека для работы с диапазонами (ranges) в C++. Она расширяет стандартную библиотеку шаблонов (STL), делая итераторы и алгоритмы более мощными за счёт их композируемости. Библиотека стала основой для формального предложения по добавлению поддержки диапазонов в стандартную библиотеку C++, которое в итоге вошло в C++20.
Особенности
- реализация концепции диапазонов как абстракции поверх итераторов;
- три основные составляющие: представления (views), действия (actions) и алгоритмы (algorithms);
- поддержка ленивых (lazy) вычислений через композируемые представления;
- синтаксис конвейеров с использованием оператора
|для читаемости кода слева направо; - header-only библиотека, не требующая компиляции.
Основные компоненты
Библиотека организована в несколько логических модулей, каждый из которых отвечает за определённый аспект работы с диапазонами (подробнее с документацией можно ознакомиться здесь).
Представления
Представления — это ленивые, невладеющие, немодифицирующие обёртки над последовательностями элементов. Они позволяют комбинировать операции адаптации без немедленного выполнения и без копирования данных. Создание и копирование представлений дёшево.
Основные функции представлений:
views::remove_if(pred)— фильтрация элементов по предикату;views::transform(fun)— применение функции к каждому элементу;views::take(n)— ограничение количества элементов;views::ints— генерация бесконечной последовательности целых чисел;views::for_eachиyield_from— создание последовательности с помощью comprehension;- полный набор адаптеров включает
filter,transform,reverse,join,split,zip,strideи многие другие.
Действия
Действия — это энергичные (eager) алгоритмы, которые мутируют контейнер на месте и возвращают его для дальнейших действий. Они также композируются через оператор |.
Основные действия:
actions::sort— сортировка контейнера;actions::unique— удаление последовательных дубликатов;actions::push_back— добавление элементов в конец.
Алгоритмы
Range-v3 предоставляет полные реализации всех стандартных алгоритмов с перегрузками, принимающими диапазоны вместо пары итераторов. Это повышает удобство и безопасность кода.
Основные категории алгоритмов:
- Поисковые/запросные:
find,count,equal,mismatch,search; - Трансформационные:
copy,move,transform,replace,fill,generate; - Численные:
accumulate,partial_sum,adjacent_difference,iota.
Вспомогательные библиотеки
В состав Range-v3 входят две дополнительные header-only библиотеки:
- Concepts (CPP): набор макросов для определения и проверки концепций, работающий даже на компиляторах без поддержки C++20 concepts;
- Meta: небольшая библиотека для метапрограммирования, упрощающая обработку типов и списков типов на этапе компиляции.