То, ради чего стоит использовать Ranges — это конвейеры (
pipelines). Оператор | позволяет обрабатывать данные через цепочку преобразований:🥲 Как это выглядело до C++20:
std::vector<int> temp, result;
std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(temp),
[](int n) { return n % 2 == 0; });
std::transform(temp.begin(), temp.end(), std::back_inserter(result),
[](int n) { return n * n; });
❗️ Вложенные алгоритмы, временные буферы, много шума.
🙂 С конвейером (C++20):
#include <ranges>
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// Конвейер: фильтруем чётные → возводим в квадрат → берём первые 3
auto result = numbers
| std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * n; })
| std::views::take(3);
for (int x : result) {
std::cout << x << " "; // 4 16 36
}
std::cout << "\n";
}
❗️ result — это не вектор, а «вид» (
view). Вычисления происходят лениво — только в момент итерации в цикле for. Исходный вектор numbers остаётся нетронутым.❓ Нужен именно вектор? Материализуйте результат:
// C++23
auto vec = result | std::ranges::to<std::vector>();
// C++20
std::vector<int> vec(result.begin(), result.end());
🐸 Продолжение следует...
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность