Searchable
概念表示可以搜索的结构。
直观地说,Searchable
是任何结构,有限或无限,包含可以使用谓词搜索的元素。有时,Searchable
会将键与值关联;可以使用谓词搜索键,并返回与其关联的值。这产生了类似映射的数据结构。其他时候,搜索的结构元素(即应用谓词的元素)与返回的元素相同,这产生了类似集合的数据结构。一般来说,我们将 Searchable
结构的键称为用于搜索的元素,并将 Searchable
的值称为搜索成功时返回的元素。如前所述,这两个概念没有必要不同,并且键和值重合通常很有用(例如 std::set
)。
一些方法,如 any_of
、all_of
和 none_of
,允许对结构的键执行简单的查询,而其他方法,如 find
和 find_if
,则可以找到与键关联的值。如果关心性能,则应始终使用最具体的方法,因为通常可以在更具体的方法中执行大量的优化。例如,作为哈希表实现的关联数据结构使用 find
访问的速度将比使用 find_if
快得多,因为在第二种情况下,它必须对所有条目进行线性搜索。类似地,使用 contains
可能比使用具有等效谓词的 any_of
快得多。
见解
在惰性求值上下文中,任何Foldable
也可以成为Searchable
的模型,因为我们可以使用fold_right
对结构进行惰性搜索。但是,在 C++ 的上下文中,某些Searchable
无法折叠;例如,考虑一个无限集合。
find_if
和 any_of
当提供 find_if
和 any_of
时,其他函数将根据下面解释的规则实现。
find_if(xs, pred)
是否为空 optional
来实现 any_of(xs, pred)
,然后将最小完整定义减少到 find_if
。但是,这样做是因为该实现要求 any_of
的谓词返回编译时 Logical
,这比我们现在拥有的更具限制性。为了使方法的语义一致,Searchable
概念的任何模型都必须满足某些属性。严格来说,对于任何 Searchable
s xs
和 ys
以及任何谓词 p
,以下规则应满足
此外,如果 Searchable
的所有键都是 Logical
,则应满足以下规则
hana::map
、hana::optional
、hana::range
、hana::set
、hana::string
、hana::tuple
已知大小的内置数组可以像同构元组一样进行搜索。但是,由于数组只能保存单一类型的对象,并且 find_if
的谓词必须返回编译时 Logical
,因此 find_if
方法相当无用。出于类似的原因,find
方法也相当无用。提供此模型主要是为了 any_of
方法及其朋友,它们既有用又编译时高效。
给定两个 Searchables
S1
和 S2
,函数 \( f : S_1(X) \to S_2(X) \) 被认为保留了 Searchable
结构,如果对于所有数据类型为 S1(X)
的 xs
和谓词 \( \mathtt{pred} : X \to Bool \)(对于 Logical
Bool
),
这实际上只是以下更直观的要件的推广。对于所有数据类型为 S1(X)
的 xs
和数据类型为 X
的 x
,
这些要件可以理解为 f
不会更改 xs
的内容,尽管它可能会重新排序元素。像往常一样,如果这种保持结构的转换也是单射的,即如果它是无损转换,则称其为嵌入。
变量 | |
constexpr auto | boost::hana::all |
返回结构的所有键是否都为真值。 更多... | |
constexpr auto | boost::hana::all_of |
返回结构的所有键是否都满足predicate 。 更多... | |
constexpr auto | boost::hana::any |
返回结构的任何键是否为真值。 更多... | |
constexpr auto | boost::hana::any_of |
返回结构的任何键是否满足predicate 。 更多... | |
constexpr auto | boost::hana::at_key |
返回与结构中给定键关联的值,或失败。 更多... | |
constexpr auto | boost::hana::contains |
返回键是否出现在结构中。 更多... | |
constexpr auto | boost::hana::in = hana::infix(hana::flip(hana::contains)) |
返回键是否出现在结构中。 更多... | |
constexpr auto | boost::hana::find |
在结构中查找与给定键关联的值。 更多... | |
constexpr auto | boost::hana::find_if |
查找与满足谓词的第一个键关联的值。 更多... | |
constexpr auto | boost::hana::is_disjoint |
返回两个Searchable 是否不相交。 更多... | |
constexpr auto | boost::hana::is_subset |
返回一个结构是否包含另一个结构键的子集。 更多... | |
constexpr auto | boost::hana::none |
返回结构的所有键是否都为假值。 更多... | |
constexpr auto | boost::hana::none_of |
返回结构体中是否没有键满足predicate 。 更多... | |
|
constexpr |
#include <boost/hana/fwd/all.hpp>
返回结构的所有键是否都为真值。
结构体的键必须是Logical
类型。如果结构体不是有限的,则必须在有限的“索引”处出现一个假值键,以便此方法完成。
|
constexpr |
#include <boost/hana/fwd/all_of.hpp>
返回结构体中所有键是否都满足predicate
。
如果结构体不是有限的,则predicate
必须在查看有限数量的键后返回一个假值Logical
,以便此方法完成。
xs | 要搜索的结构体。 |
predicate | 一个函数,调用方式为predicate(k) ,其中k 是结构体的键,并返回一个Logical 。 |
|
constexpr |
#include <boost/hana/fwd/any.hpp>
返回结构的任何键是否为真值。
结构体的键必须是Logical
类型。如果结构体不是有限的,则必须在有限的“索引”处出现一个真值键,以便此方法完成。
|
constexpr |
#include <boost/hana/fwd/any_of.hpp>
返回结构体中是否有任何键满足predicate
。
如果结构体不是有限的,则必须在查看有限数量的键后满足predicate
,以便此方法完成。
xs | 要搜索的结构体。 |
predicate | 一个函数,调用方式为predicate(k) ,其中k 是结构体的键,并返回一个Logical 。 |
|
constexpr |
#include <boost/hana/fwd/at_key.hpp>
返回与结构体中给定键关联的值,或失败。
给定一个key
和一个Searchable
结构体,at_key
返回第一个键等于给定key
的值,如果不存在这样的键,则在编译时失败。这要求key
是编译时Comparable
,就像find
一样。at_key
满足以下条件
如果Searchable
实际上存储了它包含的元素,则at_key
需要返回左值引用、const 的左值引用或找到的值的右值引用,其中引用的类型必须与传递给at_key
的结构体的类型匹配。如果Searchable
不存储它包含的元素(即它按需生成它们),则此要求将被放弃。
xs | 要搜索的结构体。 |
key | 要在结构体中搜索的键。该键必须与结构体的其他键具有Comparable 关系。在库的当前版本中,key 与结构体任何其他键的比较必须返回编译时Logical 。 |
|
constexpr |
#include <boost/hana/fwd/contains.hpp>
返回键是否出现在结构中。
给定一个Searchable
结构体xs
和一个key
,contains
返回结构体中是否有任何键等于给定的key
。如果结构体不是有限的,则必须在结构体的有限位置出现一个相等的键,以便此方法完成。为方便起见,contains
也可以应用于中缀表示法。
xs | 要搜索的结构体。 |
key | 要在结构体中搜索的键。该键必须与结构体的其他键具有Comparable 关系。 |
|
constexpr |
#include <boost/hana/fwd/contains.hpp>
返回键是否出现在结构中。
具体来说,这等价于 contains
,除了 in
以相反的顺序获取其参数。与 contains
一样,in
也可以使用中缀表示法应用于提高表达力。此函数不是可以覆盖的方法;它只是概念提供的便捷函数。
|
constexpr |
#include <boost/hana/fwd/find.hpp>
在结构中查找与给定键关联的值。
给定一个 key
和一个 Searchable
结构,find
返回第一个键等于给定 key
的值的 just
,如果不存在这样的键,则返回 nothing
。比较使用 equal
完成。find
满足以下条件
xs | 要搜索的结构体。 |
key | 要在结构体中搜索的键。该键必须与结构体的其他键具有Comparable 关系。在库的当前版本中,key 与结构体任何其他键的比较必须返回编译时Logical 。 |
|
constexpr |
#include <boost/hana/fwd/find_if.hpp>
查找与满足谓词的第一个键关联的值。
给定一个 Searchable
结构 xs
和一个谓词 pred
,find_if(xs, pred)
返回第一个键满足谓词的元素的 just
,如果不存在这样的元素,则返回 nothing
。
xs | 要搜索的结构体。 |
predicate | 一个称为 predicate(k) 的函数,其中 k 是结构的键,并返回 k 是否是正在搜索的元素的键。在库的当前版本中,谓词必须返回一个 IntegralConstant ,其中包含一个可以转换为 bool 的值。 |
|
constexpr |
#include <boost/hana/fwd/is_disjoint.hpp>
返回两个 Searchable
是否不相交。
给定两个 Searchable
xs
和 ys
,is_disjoint
返回一个 Logical
,表示 xs
中的键是否与 ys
中的键不相交,即两个结构是否没有公共键。
xs,ys | 要测试是否不相交的两个 Searchable 。 |
|
constexpr |
#include <boost/hana/fwd/is_subset.hpp>
返回一个结构是否包含另一个结构键的子集。
给定两个 Searchable
xs
和 ys
,is_subset
返回一个 Logical
,表示 xs
是否是 ys
的子集。换句话说,它返回 xs
的所有键是否也存在于 ys
中。此方法不返回 xs
是否是 ys
的严格子集;如果 xs
和 ys
相等,则 xs
的所有键也存在于 ys
中,并且 is_subset
返回 true。
is_subset
也可以使用中缀表示法应用。此方法使用两个参数的标签进行标签分派。它可以用任何两个共享公共 Searchable
嵌入的 Searchable
调用,如 Searchable
概念的主要文档中所定义。当具有两个不同标签但共享公共嵌入的 Searchable
发送到 is_subset
时,它们首先转换为这个公共 Searchable
,然后使用公共嵌入的 is_subset
方法。当然,可以为自定义 Searchable
覆盖此方法以提高效率。
is_subset
的跨类型分派,但库目前未使用它,因为没有具有公共嵌入的 Searchable
模型。xs | 要检查它是否是 ys 的子集的结构。 |
ys | 要检查它是否是 xs 的超集的结构。 |
|
constexpr |
#include <boost/hana/fwd/none.hpp>
返回结构的所有键是否都为假值。
结构体的键必须是Logical
类型。如果结构体不是有限的,则必须在有限的“索引”处出现一个真值键,以便此方法完成。
|
constexpr |
#include <boost/hana/fwd/none_of.hpp>
返回结构的键中是否没有一个满足 predicate
。
如果结构不是有限的,则此方法需要在查看有限数量的键后,predicate
必须返回一个真值的 Logical
才能完成。
xs | 要搜索的结构体。 |
predicate | 一个函数,调用方式为predicate(k) ,其中k 是结构体的键,并返回一个Logical 。 |