文章导读
大家好,我是陈景序,今天我们来聊聊C++中的ranges库。你可能对STL容器和算法已经很熟悉了,但ranges库的出现,让我们的代码变得更加简洁和直观。本文将带你一起探索ranges库的魅力,让你轻松掌握如何在C++中使用它。
lambda表达式与匿名函数
首先,让我们回顾一下lambda表达式和匿名函数的概念。如果你熟悉Python,那么你对lambda表达式应该不会陌生。在C++中,lambda表达式同样有着重要的作用。它允许我们在一行代码中定义一个匿名函数。
lambda arguments: expression
在C++中,lambda表达式的语法稍微复杂一些,但核心思想是一样的。它可以捕获外部变量,具有可选的捕获列表、可变属性和返回类型。
[ capture ]( parameters ) mutable throw() -> return_type { expression }
lambda表达式可以简化我们的代码,特别是在使用STL算法时。例如,我们可以使用lambda表达式来定义排序规则。
sort(a.begin(), a.end(), [](const int& a, const int& b) -> bool { return a > b; });
ranges库概述
接下来,我们来了解一下ranges库。ranges库是C++20标准的一部分,它提供了一种新的方式来处理STL容器和算法。在ranges库中,我们使用“range”来表示一个范围,它可以是STL容器、迭代器或者其他任何可迭代的对象。
std::vector input{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
auto output = input | std::views::filter([](int n){ return n % 3 == 0; }) | std::views::transform([](int n){ return n * n; });
这里的“|”是管道运算符,它允许我们将多个操作连接起来。例如,我们可以使用filter来筛选元素,使用transform来变换元素。
Ranges Adaptor—范围适配器
ranges库中包含了许多范围适配器,它们可以帮助我们完成各种操作。例如,filter可以筛选元素,transform可以变换元素,all可以将可迭代对象转换为视图,reverse可以倒置视图,take和drop可以取前n个或抛弃前n个元素,take_while和drop_while可以根据条件取或抛弃元素。
auto view = vec | views::all | views::reverse;
for (auto i : view | views::take(3)) {
cout << i <<
