查看源码 sets (stdlib v6.2)
集合是不包含重复元素的元素集合。
此模块使用的表示集合的数据应被其他模块视为不透明的。抽象地说,该表示是现有 Erlang 项的复合类型。请参阅关于数据类型的说明。任何假设了解格式的代码都处于危险之中。
此模块提供了与 ordsets
模块相同的接口,但表示方式未定义。一个区别是,虽然此模块认为如果两个元素不匹配(=:=
),则它们是不同的,但 ordsets
仅当两个元素不比较相等(==
)时才认为它们是不同的。
Erlang/OTP 24.0 引入了一种新的更高效的集合内部表示。开发人员可以通过将 {version, 2}
标志传递给 new/1
和 from_list/2
来使用这种新的表示方式,例如 sets:new([{version, 2}])
。这种新的表示方式将在未来的 Erlang/OTP 版本中成为默认设置。适用于两个集合的函数,例如 union/2
及类似函数,将适用于不同版本的集合。在这种情况下,无法保证返回的集合的版本。可以使用 sets:from_list(sets:to_list(Old), [{version,2}])
显式地将旧版本转换为新版本。
兼容性
此模块中的以下函数也存在于 gb_sets
和 ordsets
模块中,并提供相同的功能。也就是说,只需更改每个调用的模块名称,即可尝试不同的集合表示。
add_element/2
del_element/2
filter/2
filtermap/2
fold/3
from_list/1
intersection/1
intersection/2
is_element/2
is_empty/1
is_equal/2
is_set/1
is_subset/2
map/2
new/0
size/1
subtract/2
to_list/1
union/1
union/2
注意
虽然这三个集合实现针对上述函数提供了相同功能,但它们的整体行为可能有所不同。如前所述,此模块仅当元素不匹配(
=:=
)时才认为它们是不同的,而ordsets
和gb_sets
仅当元素不比较相等(==
)时才认为它们是不同的。示例
1> sets:is_element(1.0, sets:from_list([1])). false 2> ordsets:is_element(1.0, ordsets:from_list([1])). true 2> gb_sets:is_element(1.0, gb_sets:from_list([1])). true
另请参阅
总结
函数
返回一个由 Set1
和插入的 Element
构成的新集合。
返回 Set1
,但删除了 Element
。
使用布尔函数 Pred
过滤 Set1
中的元素。
使用函数 Fun
过滤和映射 Set1
中的元素。
对 Set
中的每个元素执行 Function
折叠,并返回累加器的最终值。评估顺序未定义。
返回 List
中元素的集合。
返回给定版本的 List
中元素的集合。
返回非空集合列表的交集。
返回 Set1
和 Set2
的交集。
如果 Set1
和 Set2
不相交(没有共同元素),则返回 true
,否则返回 false
。
如果 Element
是 Set
的元素,则返回 true
,否则返回 false
。
如果 Set
是空集,则返回 true
,否则返回 false
。
如果 Set1
和 Set2
相等,即当一个集合的每个元素也是另一个集合的成员时,则返回 true
,否则返回 false
。
如果 Set
看起来是元素集合,则返回 true
,否则返回 false
。
当 Set1
的每个元素也是 Set2
的成员时,返回 true
,否则返回 false
。
使用映射函数 Fun
映射 Set1
中的元素。
返回一个新的空集合。
返回给定版本的新空集合。
返回 Set
中的元素数量。
仅返回 Set1
中那些不是 Set2
元素的元素。
以列表形式返回 Set
的元素。返回元素的顺序未定义。
返回集合列表的合并(并集)集合。
返回 Set1
和 Set2
的合并(并集)集合。
类型
函数
返回一个由 Set1
和插入的 Element
构成的新集合。
返回 Set1
,但删除了 Element
。
-spec filter(Pred, Set1) -> Set2 when Pred :: fun((Element) -> boolean()), Set1 :: set(Element), Set2 :: set(Element).
使用布尔函数 Pred
过滤 Set1
中的元素。
-spec filtermap(Fun, Set1) -> Set2 when Fun :: fun((Element1) -> boolean() | {true, Element2}), Set1 :: set(Element1), Set2 :: set(Element1 | Element2).
使用函数 Fun
过滤和映射 Set1
中的元素。
-spec fold(Function, Acc0, Set) -> Acc1 when Function :: fun((Element, AccIn) -> AccOut), Set :: set(Element), Acc0 :: Acc, Acc1 :: Acc, AccIn :: Acc, AccOut :: Acc.
对 Set
中的每个元素执行 Function
折叠,并返回累加器的最终值。评估顺序未定义。
-spec from_list(List) -> Set when List :: [Element], Set :: set(Element).
返回 List
中元素的集合。
-spec from_list(List, [{version, 1..2}]) -> Set when List :: [Element], Set :: set(Element).
返回给定版本的 List
中元素的集合。
返回非空集合列表的交集。
-spec intersection(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
返回 Set1
和 Set2
的交集。
如果 Set1
和 Set2
不相交(没有共同元素),则返回 true
,否则返回 false
。
如果 Element
是 Set
的元素,则返回 true
,否则返回 false
。
如果 Set
是空集,则返回 true
,否则返回 false
。
如果 Set1
和 Set2
相等,即当一个集合的每个元素也是另一个集合的成员时,则返回 true
,否则返回 false
。
如果 Set
看起来是元素集合,则返回 true
,否则返回 false
。
请注意,该测试是浅层的,对于任何与集合的可能表示形式一致的项都将返回 true
。另请参阅关于数据类型的说明。
当 Set1
的每个元素也是 Set2
的成员时,返回 true
,否则返回 false
。
-spec map(Fun, Set1) -> Set2 when Fun :: fun((Element1) -> Element2), Set1 :: set(Element1), Set2 :: set(Element2).
使用映射函数 Fun
映射 Set1
中的元素。
返回一个新的空集合。
返回给定版本的新空集合。
-spec size(Set) -> non_neg_integer() when Set :: set().
返回 Set
中的元素数量。
-spec subtract(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
仅返回 Set1
中那些不是 Set2
元素的元素。
-spec to_list(Set) -> List when Set :: set(Element), List :: [Element].
以列表形式返回 Set
的元素。返回元素的顺序未定义。
返回集合列表的合并(并集)集合。
-spec union(Set1, Set2) -> Set3 when Set1 :: set(Element), Set2 :: set(Element), Set3 :: set(Element).
返回 Set1
和 Set2
的合并(并集)集合。