← 模式
基于范围的算法
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 行定义了一个表示基于范围的算法的函数模板。它接受一个范围参数,该参数可以是任何支持 begin
和 end
函数的类型,这两个函数提供指向范围开始和结束的迭代器。一个范围可以根据其提供的迭代器进行分类:
- 前向范围 (Forward Range) - 提供前向迭代器 (Forward Iterators)
- 双向范围 (Bidirectional Range) - 提供双向迭代器 (Bidirectional Iterators)
- 随机访问范围 (Random Access Range) - 提供随机访问迭代器 (Random Access Iterators)
在示例代码中,我们假设该算法只需要前向迭代器,因此可以应用于任何前向范围。因此,我们在第 4 行将模板参数命名为 ForwardRange
以说明这一点。
在第 12-13 行,我们在范围上调用 begin
和 end
来获取指向范围开始和结束的相应迭代器。我们在第 7-8 行使用 using-declarations,以便在调用标准的 std::begin
和 std::end
函数之前,通过依赖于参数的名字查找 (argument-dependent lookup) 找到这些调用。有了这些迭代器,我们现在就可以在它们之间的元素上实现算法了。
如果实现算法并不需要迭代器,我们或许可以使用一个简单的基于范围的 for
循环。