痛点:你有一段数据处理逻辑——筛选、转换、取前 N 个。传统写法会产生多个中间容器:
std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 传统风格:产生两个临时 vector
std::vector<int> evens;
std::copy_if(data.begin(), data.end(), std::back_inserter(evens),
[](int x) { return x % 2 == 0; }); // ① 分配 evens
std::vector<int> doubled;
std::transform(evens.begin(), evens.end(), std::back_inserter(doubled),
[](int x) { return x * 10; }); // ② 分配 doubled
std::vector<int> top3;
std::copy_n(doubled.begin(), 3, std::back_inserter(top3)); // ③ 分配 top3
// 3 次分配、3 次遍历、3N 次拷贝
Ranges 的做法:
auto result = data
| std::views::filter([](int x) { return x % 2 == 0; })
| std::views::transform([](int x) { return x * 10; })
| std::views::take(3);
// 0 次分配、1 次遍历、0 次多余拷贝
Ranges 的核心承诺:写出表达力强的代码,但不付出性能代价。