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
的 Foldable
Iterable
都会产生一个 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
。