flowchart LR
subgraph "传统容器"
A["📦 容器 [1,2,3,4,5]"] --> B["复制全部数据"]
end
subgraph "Ranges View"
C["🔗 View(视图)"] --> D["按需计算,惰性求值"]
end
style A fill:#FFB3C6,stroke:#F48FB1,color:#333
style B fill:#FFDAB9,stroke:#FFAB76,color:#333
style C fill:#B5EAD7,stroke:#80CBC4,color:#333
style D fill:#C7CEEA,stroke:#9FA8DA,color:#333
1.2 管道操作符:|
Ranges 最大的创新是管道操作符|,将多个操作串联成链:
1 2 3 4 5
// 原:嵌套调用 auto result = take(transform(filter(nums, pred), func), n);
// 新:管道风格 auto result = nums | filter(pred) | transform(func) | take(n);
intmain(){ std::vector<int> nums = {1,2,3,4,5,6,7,8,9,10}; // Ranges: 惰性求值,管道组合 auto result = nums | rv::filter([](int n) { return n % 2 == 0; }) | rv::transform([](int n) { return n * n; }) | rv::take(3); for (int n : result) { std::cout << n << " "; // 4 16 36 } std::cout << "\n"; // views::iota: 无限序列 auto squares = rv::iota(1) | rv::transform([](int n) { return n * n; }) | rv::take(5); for (int s : squares) std::cout << s << " "; // 1 4 9 16 25 std::cout << "\n"; // reverse, drop, take for (int n : nums | rv::reverse | rv::drop(3) | rv::take(4)) { std::cout << n << " "; // 10 9 8 7 } std::cout << "\n"; // all + common auto v = nums | rv::common; std::sort(v.begin(), v.end()); }
2.1 filter:过滤
1
auto evens = nums | rv::filter([](int n){ return n % 2 == 0; });
2.2 transform:转换
1
auto squared = nums | rv::transform([](int n){ return n * n; });
2.3 take / drop:截取
1 2
auto first5 = nums | rv::take(5); // 前5个 auto rest = nums | rv::drop(3); // 跳过前3个
2.4 reverse:反转
1
auto reversed = nums | rv::reverse;
2.5 iota:无限序列
1 2 3 4
// 生成无限序列:1, 2, 3, 4, 5, ... auto naturals = rv::iota(1); // 配合 take 限制数量 auto first100 = rv::iota(1) | rv::take(100);
2.6 all + common:兼容旧代码
1 2 3
// std::views::all 将容器转为 view auto v = nums | rv::common; // 转为可与旧算法交互的视图 std::sort(v.begin(), v.end());
三、视图组合示意
flowchart LR
N["📥 [1,2,3,4,5,6,7,8,9,10]"]
F["🔍 filter(偶数)"]
T["✨ transform(平方)"]
K["📏 take(3)"]
O["📤 [4, 16, 36]"]
N --> F --> T --> K --> O
style N fill:#C7CEEA,stroke:#9FA8DA,color:#333
style F fill:#E8D5F5,stroke:#CE93D8,color:#333
style T fill:#FFDAB9,stroke:#FFAB76,color:#333
style K fill:#B5EAD7,stroke:#80CBC4,color:#333
style O fill:#FFB3C6,stroke:#F48FB1,color:#333