跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

C++中的ranges库,到底怎么用?

文章导读

大家好,我是陈景序,今天我们来聊聊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 <<
                            

相关文章