C++20 Ranges:声明式数据管道
学习使用范围库进行惰性求值、视图组合和算法管道操作,告别传统迭代器。 · 难度:入门 · +15XP
Ranges 概述
C++20 Ranges为STL算法提供了更现代、更可组合的接口。核心组件包括范围适配器和视图,支持惰性求值。
基本用法
#include <ranges>
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5, 6};
// 传统方式
for (int i : nums)
if (i % 2 == 0) std::cout << i << ' ';
std::cout << '
';
// Ranges 方式
auto even = nums | std::views::filter([](int n){ return n % 2 == 0; });
for (int i : even)
std::cout << i << ' ';
}
视图组合
使用管道操作符可以链式组合多个视图。
auto result = nums
| std::views::filter([](int n){ return n > 2; })
| std::views::transform([](int n){ return n * n; })
| std::views::take(3);
for (int i : result) std::cout << i << ' '; // 输出 9 16 25
重要概念
| 组件 | 说明 |
|---|---|
std::views::filter | 保留满足谓词的元素 |
std::views::transform | 对每个元素应用转换 |
std::views::take | 取前N个元素 |
std::views::drop | 跳过前N个元素 |
练习提示
给定一个字符串向量,使用ranges管道筛选出长度大于3的字符串,并转换为大写,最后取前5个。提示:可以使用std::views::transform配合std::toupper。