← 模式

基于范围的算法

12345678910111213141516#include <iterator> #include <utility> template <typename ForwardRange> void algorithm(ForwardRange& range) { using std::begin; using std::end; using iterator = decltype(begin(range)); iterator it_begin = begin(range); iterator it_end = end(range); // 现在使用 it_begin 和 it_end 来实现算法 }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

实现可应用于任何通用元素范围的算法。

描述

注意:标准库中现有的算法不是基于范围的,而是基于迭代器的。然而,Ranges 技术规范正在试验将范围和基于范围的算法引入标准,这更灵活,并为客户端代码提供了更简单的接口。

第 4-16 行定义了一个表示基于范围的算法的函数模板。它接受一个范围参数,该参数可以是任何支持 beginend 函数的类型,这两个函数提供指向范围开始和结束的迭代器。一个范围可以根据其提供的迭代器进行分类:

在示例代码中,我们假设该算法只需要前向迭代器,因此可以应用于任何前向范围。因此,我们在第 4 行将模板参数命名为 ForwardRange 以说明这一点。

第 12-13 行,我们在范围上调用 beginend 来获取指向范围开始和结束的相应迭代器。我们在第 7-8 行使用 using-declarations,以便在调用标准的 std::beginstd::end 函数之前,通过依赖于参数的名字查找 (argument-dependent lookup) 找到这些调用。有了这些迭代器,我们现在就可以在它们之间的元素上实现算法了。

如果实现算法并不需要迭代器,我们或许可以使用一个简单的基于范围的 for 循环

贡献者

  • Joseph Mansfield

最后更新

2018年8月27日

来源

在 GitHub 上 Fork 此模式

分享