7.8小学期基础语法记录

ranges

C++20 引入的 <ranges> 库极大增强了 C++ 对容器的操作能力,核心目标是:更简洁、更安全、更组合式的容器处理方式,类似于函数式编程中“管道”风格。


🔑 一、std::ranges 的核心组成

分类 内容
✅ 范围算法(algorithms) ranges::sort, ranges::find, ranges::copy, ranges::for_each
✅ 范围视图(views) views::filter, views::transform, views::take, views::drop, views::reverse
✅ 范围适配器(adaptors) 支持 `
✅ 范围概念(concepts) ranges::range, ranges::view, ranges::input_range,用于泛型约束

🧩 二、常用算法(std::ranges::xxx

这些是 C++20 为 ranges 提供的算法接口,使用方式类似于 std::sort(),但直接操作容器,更安全:

🔧 常用范围算法(与 std::xxx 一一对应)

算法 功能 示例
ranges::sort 排序 ranges::sort(vec)
ranges::find 查找元素 ranges::find(vec, 3)
ranges::count 计数 ranges::count(vec, 2)
ranges::copy 拷贝 ranges::copy(src, dest.begin())
ranges::for_each 遍历操作 ranges::for_each(vec, f)
ranges::equal 判断两个范围是否相等 ranges::equal(v1, v2)
ranges::unique 去重(返回去重后的迭代器) auto [first, last] = ranges::unique(vec)

🔮 三、核心视图(std::views::xxx

视图是懒惰求值的容器处理操作,类似 Python 的生成器:

🚀 管道式组合能力极强:

auto result = vec 
            | views::filter([](int x){ return x % 2 == 0; })
            | views::transform([](int x){ return x * x; })
            | views::take(3);

🌟 常用视图操作汇总

视图名 功能
views::filter 过滤满足条件的元素
views::transform 映射,每个元素映射为新值
views::take(n) 取前 n 个元素
views::drop(n) 跳过前 n 个元素
views::reverse 反转容器
views::iota(start, end) 生成区间 [start, end) 的整数流
views::split(delim) 拆分字符串
views::zip(C++23) 多容器并行遍历

🧪 示例

#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6};

    auto result = v | std::views::filter([](int n) { return n % 2 == 0; })
                    | std::views::transform([](int n) { return n * 10; });

    for (int x : result)
        std::cout << x << " ";  // 输出 20 40 60
}

📌 四、组合方式与懒惰求值

views 只在遍历(如 for)时执行实际计算,具备:

  • 延迟求值(更高效)
  • 不复制容器
  • 可链式组合

📎 五、可与 ranges 组合的容器类型

容器 是否支持
std::vector
std::array
std::list ✅(部分视图不支持)
std::map / std::set ✅(但注意访问 key/value)
自定义容器 ✅ 只要符合 ranges::range 概念

✅ 六、常用组合模板

// 拿出前 5 个平方数
auto squares = views::iota(1, 100)
             | views::transform([](int x){ return x * x; })
             | views::take(5);

// 过滤并排序 vector
auto evens = v | views::filter([](int x){ return x % 2 == 0; });
std::vector<int> evens_vec(evens.begin(), evens.end());
ranges::sort(evens_vec);

🎯 总结一句话:

C++20 ranges 提供了一个现代、高效、可组合的容器处理方式,ranges::sort 负责 算法执行,而 views::xxx 负责 懒惰生成数据流,二者可无缝配合形成流水线式编程风格。

posted @ 2025-07-08 21:12  十八Eigh18n  阅读(39)  评论(0)    收藏  举报