01 | ranges的初步印象(新旧做法的对比)

发布时间 2023-04-23 11:16:28作者: 独立树

1.ranges::sort——给容器排序

在这之前我们需要采用 标准库的sort 算法并且需要传入两个迭代器。但是现在我们可以这样,使用 ranges 命名空间下的 sort 函数,仅需要传入一个容器的名字即可。

以下是涉及到的concepts

2.views的概念——给对象进行筛选、转换、复制

我们可以将一个 range (stl容器是一个range,严格来说是有begin()和end()函数的stl容器),经过管道符传给 容器适配器,我们就可以得到视图对象,该视图对象是可以惰性求值的,因此所占的空间要比另外开辟一块空间要少,可以想象视图是百叶窗,只让你看到了应该看到的东西。

比如:接下来,我们举一个例子,筛选年龄在18岁以下的人的年龄,并将其输出到屏幕。

如果我们不使用 range 和 view 的话,就可能是这样:

3.生成递增序列——views::iota 类似python 中的 range

当然,我们也可以写一个 range 来满足斐波那契数列的惰性求值
当然,我们也可以写一个简单的协程来实现惰性求值

4.std::erase——删除满足条件的元素

使用了 range 之后,我们可以这样

而不是用的话,我们就得用 erase 和 remove_if 的常规做法

5.常用的适配器——注意是views::xxx