Iterable 概念表示支持外部迭代的数据结构。
直观地,Iterable 可以被视为一种容器,其元素可以一个接一个地被提取出来。Iterable 还提供了一种方法来知道容器何时为空,即当没有更多元素可以提取出来时。
虽然 Foldable 表示支持内部迭代并能够累积结果的数据结构,但 Iterable 概念允许反转迭代的控制。这比 Foldable 更灵活,因为它允许仅迭代结构的某些部分。这反过来又允许 Iterable 处理无限结构,而尝试折叠这样的结构将永远无法完成。
at、drop_front 和 is_empty
直观地说,对于 Iterable 结构 xs,xs 的线性化是 xs 中所有元素的序列,就像它们被放入一个(可能是无限的)列表中一样。
可以使用 at 函数访问 Iterable 线性化的第 n 个元素。换句话说,at(xs, n) == xn。
请注意,这个概念正是将 Foldable 的线性化概念扩展到无限情况。这个概念对于表达 Iterable 的各种属性很有用,并且在文档的其他地方也为此目的使用。
编译时 Iterable 是一个 Iterable,其中 is_empty 返回一个编译时 Logical。这些结构允许在编译时进行迭代,因为执行迭代的“循环”可以展开,因为结构的总长度在编译时是已知的。
特别是,请注意,成为编译时 Iterable 与是有限的还是无限的无关。例如,可以创建一个表示毕达哥拉斯三元组的序列作为 integral_constant。这样的序列将是无限的,但对序列的迭代仍然将在编译时完成。但是,如果尝试迭代序列的所有元素,编译器将无限循环,这与如果序列是运行时序列,则程序无限循环形成对比。
在库的当前版本中,仅支持编译时 Iterable。虽然从理论上讲可以支持运行时 Iterable,但高效地做到这一点是某些研究的主题。特别是,请关注此问题以了解运行时 Iterable 的当前状态。
首先,我们要求两个 Iterable 的相等性与它们线性化中元素的相等性相关。更具体地说,如果 xs 和 ys 是数据类型为 It 的两个 Iterable,则
这传达了两个 Iterable 必须具有相同的线性化才能被视为相等。
其次,由于每个 Iterable 也是一个 Searchable,我们要求 Iterable 和 Searchable 的模型一致。以下法则对此进行了精确说明。对于任何 Iterable xs,其线性化为 [x1, x2, x3, ...],
对于某些有限索引 i。此外,
或者如果不存在这样的 xi 则返回 nothing。
Searchable(免费模型)Iterable 都会产生一个 Searchable 模型,其中键和值都是结构中的元素。搜索键只是对结构的元素进行线性搜索。Iterable 的 FoldableIterable 都会产生一个 Foldable 模型。为了使这些模型保持一致,我们要求 Foldable 和 Iterable 的模型具有相同的线性化。Iterable 也是 Searchable,并且它们的模型必须保持一致。根据此处提供的法则,这也意味着有限 Iterable 的 Foldable 模型必须与 Searchable 模型保持一致。为方便起见,有限 Iterable 必须仅提供 length 的定义来建模 Foldable 概念;定义更强大的 unpack 或 fold_left 不是必需的(但仍然可以)。从 Iterable + length 派生的 unpack 的默认实现利用了 at(xs, i) 表示 xs 线性化的第 i 个元素这一事实,以及有限 Iterable 的线性化必须与其作为 Foldable 的线性化相同这一事实。
hana::tuple、hana::string、hana::range
变量 | |
| constexpr auto | boost::hana::at |
返回可迭代对象的第 n 个元素。更多... | |
| template<std::size_t n> | |
| constexpr auto | boost::hana::at_c |
等效于 at;为了方便提供。更多... | |
| constexpr auto | boost::hana::back |
| 返回非空且有限的可迭代对象的最后一个元素。更多... | |
| constexpr auto | boost::hana::drop_front |
删除可迭代对象的前 n 个元素,并返回其余元素。更多... | |
| constexpr auto | boost::hana::drop_front_exactly |
删除可迭代对象的前 n 个元素,并返回其余元素。更多... | |
| constexpr auto | boost::hana::drop_while |
从可迭代对象中删除元素,直到但不包括第一个不满足predicate的元素。更多... | |
| constexpr auto | boost::hana::front |
| 返回非空可迭代对象的第一个元素。更多... | |
| constexpr auto | boost::hana::index_if |
| 查找与满足谓词的第一个键关联的值。更多... | |
| constexpr auto | boost::hana::is_empty |
| 返回可迭代对象是否为空。更多... | |
|
constexpr |
#include <boost/hana/fwd/at.hpp>
返回可迭代对象中的第 n 个元素。
给定一个 Iterable 和一个 IntegralConstant 索引,at 返回可迭代对象线性化中位于该索引处的元素。具体来说,给定一个可迭代对象 xs,其线性化为 [x1, ..., xN],at(xs, k) 等价于 xk。
如果 Iterable 实际上存储了它包含的元素,则 at 必须返回左值引用、const 的左值引用或匹配元素的右值引用,其中引用的类型必须与传递给 at 的可迭代对象的类型匹配。如果 Iterable 不存储它包含的元素(即它按需生成它们),则此要求将被放弃。
| xs | 从中检索元素的可迭代对象。可迭代对象必须至少包含 n + 1 个元素。 |
| n | 一个非负的 IntegralConstant,表示要返回的元素的基于 0 的索引。使用超出可迭代对象范围的索引调用 at 是错误的。 |
|
constexpr |
#include <boost/hana/fwd/at.hpp>
等价于 at;为了方便提供。
hana::at_c<n> 是一个重载函数,而不是函数对象。因此,它不能传递给高阶算法。这是出于编译时性能原因。
|
constexpr |
#include <boost/hana/fwd/back.hpp>
返回非空且有限的可迭代对象的最后一个元素。
给定一个非空且有限的可迭代对象 xs,其线性化为 [x1, ..., xN],back(xs) 等于 xN。等效地,back(xs) 必须等价于 at_c<N-1>(xs),并且无论 xs 的值类别如何(back 必须尊重 at 的引用语义)。
|
constexpr |
#include <boost/hana/fwd/drop_front.hpp>
丢弃可迭代对象的前 n 个元素,并返回其余元素。
给定一个 Iterable xs,其线性化为 [x1, x2, ...] 和一个非负的 IntegralConstant n,drop_front(xs, n) 是一个与 xs 具有相同标签的可迭代对象,其线性化为 [xn+1, xn+2, ...]。特别要注意,此函数不会以任何方式修改原始可迭代对象。如果未给出 n,则默认为值为 1 的 IntegralConstant。
如果 length(xs) <= n,则 drop_front 将简单地丢弃整个可迭代对象而不失败,从而返回一个空的可迭代对象。这与 drop_front_exactly 不同,后者期望 n <= length(xs),但由于此额外保证,可以更好地优化。
| xs | 从中丢弃元素的可迭代对象。 |
| n | 一个非负的 IntegralConstant,表示要从可迭代对象中丢弃的元素数量。如果未给出 n,则默认为值为 1 的 IntegralConstant。 |
|
constexpr |
#include <boost/hana/fwd/drop_front_exactly.hpp>
丢弃可迭代对象的前 n 个元素,并返回其余元素。
给定一个 Iterable xs,其线性化为 [x1, x2, ...] 和一个非负的 IntegralConstant n,drop_front_exactly(xs, n) 是一个与 xs 具有相同标签的可迭代对象,其线性化为 [xn+1, xn+2, ...]。特别要注意,此函数不会以任何方式修改原始可迭代对象。如果未给出 n,则默认为值为 1 的 IntegralConstant。
使用 n > length(xs) 的 drop_front_exactly 是错误的。此额外保证允许 drop_front_exactly 比允许 n > length(xs) 的 drop_front 函数更好地优化。
| xs | 从中丢弃元素的可迭代对象。 |
| n | 一个非负的 IntegralConstant,表示要从可迭代对象中丢弃的元素数量。除了是非负数之外,n 还必须小于或等于 xs 中的元素数量。如果未给出 n,则默认为值为 1 的 IntegralConstant。 |
|
constexpr |
#include <boost/hana/fwd/drop_while.hpp>
丢弃可迭代对象中的元素,直到但不包括第一个不满足 predicate 的元素。
具体来说,drop_while 返回一个可迭代对象,其中包含原始可迭代对象的所有元素,除了 [head, e) 范围内的元素,其中 head 是第一个元素,e 是第一个不满足 predicate 的元素。如果可迭代对象不是有限的,则此方法需要在有限的索引处返回一个假值的 Logical 才能返回。
| iterable | 从中丢弃元素的可迭代对象。 |
| predicate | 一个函数,调用方式为 predicate(x),其中 x 是结构的元素,并返回一个 Logical,表示是否应从结构中丢弃 x。在库的当前版本中,predicate 应返回一个编译时 Logical。 |
|
constexpr |
#include <boost/hana/fwd/front.hpp>
返回非空可迭代对象的第一个元素。
给定一个非空的可迭代对象 xs,其线性化为 [x1, ..., xN],front(xs) 等于 x1。如果 xs 为空,则使用此函数是一个错误。等效地,front(xs) 必须等效于 at_c<0>(xs),并且无论 xs 的值类别如何(front 必须尊重 at 的引用语义)。
|
constexpr |
#include <boost/hana/fwd/index_if.hpp>
查找与满足谓词的第一个键关联的值。
给定一个 Iterable 结构 xs 和一个谓词 pred,index_if(xs, pred) 返回一个 hana::optional,其中包含一个满足谓词的第一个元素的索引的 IntegralConstant,或者如果没有任何元素满足谓词则返回 nothing。
| xs | 要搜索的结构。 |
| predicate | 一个作为 predicate(x) 调用的函数,其中 x 是 Iterable 结构的元素,并返回 x 是否为正在搜索的元素。在库的当前版本中,谓词必须返回一个 IntegralConstant,其中包含可以转换为 bool 的值。 |
|
constexpr |
#include <boost/hana/fwd/is_empty.hpp>
返回可迭代对象是否为空。
给定一个 Iterable xs,is_empty 返回 xs 是否不包含更多元素。换句话说,它返回尝试提取 xs 的尾部是否会出错。在库的当前版本中,is_empty 必须返回一个 IntegralConstant,其中包含可转换为 bool 的值。这是因为现在只支持编译时 Iterable。