1. 理解std::ranges的核心价值
现代C++开发者经常面临一个经典困境:如何在保持代码简洁性的同时不牺牲性能?这就是std::ranges要解决的根本问题。作为C++20引入的最重要特性之一,ranges库彻底改变了我们处理序列数据的方式。
传统C++代码中,算法和容器之间需要通过迭代器配对来协作,这种模式存在几个明显痛点:
- 代码冗长(需要显式传递begin/end)
- 容易出错(迭代器不匹配导致未定义行为)
- 组合能力差(算法嵌套时代码难以维护)
std::ranges通过引入视图(view)和范围概念(range concept),实现了声明式的编程风格。举个例子,我们来看一个实际场景:从学生列表中筛选出及格的CS专业学生并按成绩排序。
传统写法:
cpp复制std::vector<Student> cs_students;
std::copy_if(students.begin(), students.end(),
std::back_inserter(cs_students),
[](const auto& s){
return s.major == "CS" && s.score >= 60;
});
std::sort(cs_students.begin(), cs_students.end(),
[](const auto& a, const auto& b){
return a.score > b.score;
});
Ranges写法:
cpp复制auto result = students
| std::views::filter([](const auto& s){
return s.major == "CS" && s.score >= 60;
})
| std::views::transform([](const auto& s){
return std::make_pair(s.id, s.score);
})
| s
