查看源码 array (stdlib v6.2)
函数式,可扩展的数组。
数组可以具有固定大小,也可以根据需要自动增长。未显式设置的条目使用默认值。
数组使用零基索引。这是一个刻意的设计选择,与其他 Erlang 数据结构(例如元组)不同。
除非用户在创建数组时指定,否则默认值为原子 undefined
。未设置的条目和显式设置为与默认值相同的值的条目之间没有区别(比较 reset/2
)。如果需要区分未设置和已设置的条目,请确保默认值不会与已设置条目的值混淆。
数组永远不会自动缩小。如果索引 I
已成功用于设置条目,则除非通过调用 resize/2
显式更改数组大小,否则范围 [0,I]
中的所有索引都保持可访问。
示例
创建一个固定大小的数组,其中条目 0-9 设置为 undefined
A0 = array:new(10).
10 = array:size(A0).
创建一个可扩展的数组并将条目 17 设置为 true
,导致数组自动增长
A1 = array:set(17, true, array:new()).
18 = array:size(A1).
读回存储的值
true = array:get(17, A1).
访问未设置的条目将返回默认值
undefined = array:get(3, A1)
如果数组不具有固定大小,则访问超出最后一个已设置条目的条目也会返回默认值
undefined = array:get(18, A1).
“稀疏”函数会忽略默认值的条目
A2 = array:set(4, false, A1).
[{4, false}, {17, true}] = array:sparse_to_orddict(A2).
可扩展的数组稍后可以设置为固定大小
A3 = array:fix(A2).
固定大小的数组不会自动增长,并且不允许访问超出最后一个已设置条目的范围
{'EXIT',{badarg,_}} = (catch array:set(18, true, A3)).
{'EXIT',{badarg,_}} = (catch array:get(18, A3)).
概要
类型
函数式,可扩展的数组。该表示形式未记录,如有更改,恕不另行通知。请注意,数组不能直接比较是否相等。
函数
获取用于未初始化条目的值。
固定数组大小。这可以防止它在插入时自动增长。
使用指定的函数和初始累加器值折叠数组元素。元素按照从最低索引到最高索引的顺序访问。
使用指定的函数和初始累加器值从右到左折叠数组元素。元素按照从最高索引到最低索引的顺序访问。
将列表转换为可扩展数组。Default
用作数组中未初始化条目的值。
将成对的有序列表 {Index, Value}
转换为相应的可扩展数组。Default
用作数组中未初始化条目的值。
获取条目 I
的值。
如果 X
是数组,则返回 true
,否则返回 false
。
检查数组是否具有固定大小。如果数组是固定的,则返回 true
,否则返回 false
。
将指定的函数映射到每个数组元素。元素按照从最低索引到最高索引的顺序访问。
创建一个新的、初始大小为零的可扩展数组。
根据指定的选项创建新数组。默认情况下,该数组是可扩展的,并且初始大小为零。数组索引从 0
开始。
根据指定的大小和选项创建新数组。
使数组可调整大小。(反转 fix/1
的效果。)
将条目 I
重置为数组的默认值。如果条目 I
的值是默认值,则返回的数组不变。
将数组大小更改为 sparse_size/1
报告的大小。如果指定的数组具有固定大小,则结果数组也具有固定大小。
更改数组大小。
将数组的条目 I
设置为 Value
。
获取数组中条目的数量。条目从 0
到 size(Array)-1
编号。因此,这也是保证以前未设置的第一个条目的索引。
使用指定的函数和初始累加器值折叠数组元素,跳过默认值的条目。元素按照从最低索引到最高索引的顺序访问。
使用指定的函数和初始累加器值从右到左折叠数组元素,跳过默认值的条目。元素按照从最高索引到最低索引的顺序访问。
将指定的函数映射到每个数组元素,跳过默认值的条目。元素按照从最低索引到最高索引的顺序访问。
获取数组中直到最后一个非默认值条目的条目数。也就是说,如果 I
是数组中最后一个非默认值条目,则返回 I+1
;如果不存在此类条目,则返回零。
将数组转换为列表,跳过默认值的条目。
将数组转换为成对的有序列表 {Index, Value}
,跳过默认值的条目。
将数组转换为列表。
将数组转换为成对的有序列表 {Index, Value}
。
类型
-opaque array(Type)
函数式,可扩展的数组。该表示形式未记录,如有更改,恕不另行通知。请注意,数组不能直接比较是否相等。
-type array_indx() :: non_neg_integer().
-type array_opt() :: {fixed, boolean()} | fixed | {default, Type :: term()} | {size, N :: non_neg_integer()} | (N :: non_neg_integer()).
-type indx_pair(Type) :: {Index :: array_indx(), Type}.
-type indx_pairs(Type) :: [indx_pair(Type)].
函数
-spec default(Array :: array(Type)) -> Value :: Type.
获取用于未初始化条目的值。
另请参见 new/2
。
固定数组大小。这可以防止它在插入时自动增长。
-spec foldl(Function, InitialAcc :: A, Array :: array(Type)) -> B when Function :: fun((Index :: array_indx(), Value :: Type, Acc :: A) -> B).
使用指定的函数和初始累加器值折叠数组元素。元素按照从最低索引到最高索引的顺序访问。
如果 Function
不是函数,则调用将失败并出现原因 badarg
。
另请参见 foldr/3
、map/2
、sparse_foldl/3
。
-spec foldr(Function, InitialAcc :: A, Array :: array(Type)) -> B when Function :: fun((Index :: array_indx(), Value :: Type, Acc :: A) -> B).
使用指定的函数和初始累加器值从右到左折叠数组元素。元素按照从最高索引到最低索引的顺序访问。
如果 Function
不是函数,则调用将失败并出现原因 badarg
。
-spec from_list(List :: [Value :: Type]) -> array(Type).
将列表转换为可扩展数组。Default
用作数组中未初始化条目的值。
如果 List
不是正确的列表,则调用将失败并出现原因 badarg
。
-spec from_orddict(Orddict :: indx_pairs(Value :: Type)) -> array(Type).
-spec from_orddict(Orddict :: indx_pairs(Value :: Type), Default :: Type) -> array(Type).
将成对的有序列表 {Index, Value}
转换为相应的可扩展数组。Default
用作数组中未初始化条目的值。
如果 Orddict
不是正确的、有序的、第一个元素为非负整数的对列表,则调用将失败并出现原因 badarg
。
另请参见 new/2
、to_orddict/1
。
-spec get(I :: array_indx(), Array :: array(Type)) -> Value :: Type.
获取条目 I
的值。
如果 I
不是非负整数,或者如果数组具有固定大小且 I
大于最大索引,则调用将失败并出现原因 badarg
。
如果数组不具有固定大小,则返回任何大于 size(Array)-1
的索引 I
的默认值。
另请参见 set/3
。
如果 X
是数组,则返回 true
,否则返回 false
。
请注意,该检查只是浅层的,因为即使此函数返回 true
,也不能保证 X
是格式良好的数组表示形式。
检查数组是否具有固定大小。如果数组是固定的,则返回 true
,否则返回 false
。
另请参见 fix/1
。
-spec map(Function, Array :: array(Type1)) -> array(Type2) when Function :: fun((Index :: array_indx(), Type1) -> Type2).
将指定的函数映射到每个数组元素。元素按照从最低索引到最高索引的顺序访问。
如果 Function
不是函数,则调用将失败并出现原因 badarg
。
另请参见 foldl/3
、foldr/3
、sparse_map/2
。
-spec new() -> array().
创建一个新的、初始大小为零的可扩展数组。
-spec new(Options :: array_opts()) -> array().
根据指定的选项创建新数组。默认情况下,该数组是可扩展的,并且初始大小为零。数组索引从 0
开始。
Options
是一个单项或一个项列表,从以下选项中选择
N::integer() >= 0
或{size, N::integer() >= 0}
- 指定初始数组大小;这也意味着{fixed, true}
。如果N
不是非负整数,则调用会因badarg
错误而失败。fixed
或{fixed, true}
- 创建一个固定大小的数组。另请参阅fix/1
。{fixed, false}
- 创建一个可扩展(非固定大小)的数组。{default, Value}
- 将数组的默认值设置为Value
。
选项按照它们在列表中出现的顺序进行处理,也就是说,后面的选项具有更高的优先级。
默认值用作未初始化条目的值,并且一旦创建数组就不能更改。
示例
array:new(100)
创建一个大小为 100 的固定大小数组。
array:new({default,0})
创建一个空的、可扩展的数组,其默认值为 0
。
array:new([{size,10},{fixed,false},{default,-1}])
创建一个初始大小为 10,默认值为 -1
的可扩展数组。
-spec new(Size :: non_neg_integer(), Options :: array_opts()) -> array().
根据指定的大小和选项创建新数组。
如果 Size
不是非负整数,则调用会因 badarg
错误而失败。默认情况下,数组具有固定大小。请注意,Options
中的任何大小规范都会覆盖参数 Size
。
如果 Options
是一个列表,则等效于 new([{size, Size} | Options])
,否则等效于 new([{size, Size} | [Options]])
。但是,直接使用此函数效率更高。
示例
array:new(100, {default,0})
创建一个大小为 100,默认值为 0
的固定大小数组。
另请参阅 new/1
。
使数组可调整大小。(反转 fix/1
的效果。)
另请参见 fix/1
。
-spec reset(I :: array_indx(), Array :: array(Type)) -> array(Type).
将条目 I
重置为数组的默认值。如果条目 I
的值是默认值,则返回的数组不变。
Reset 永远不会更改数组大小。可以通过调用 resize/2
显式地缩小数组。
如果 I
不是非负整数,或者如果数组具有固定大小且 I
大于最大索引,则调用会因 badarg
错误而失败;比较 set/3
将数组大小更改为 sparse_size/1
报告的大小。如果指定的数组具有固定大小,则结果数组也具有固定大小。
另请参阅 resize/2
、sparse_size/1
。
-spec resize(Size :: non_neg_integer(), Array :: array(Type)) -> array(Type).
更改数组大小。
如果 Size
不是非负整数,则调用会因 badarg
错误而失败。如果指定的数组具有固定大小,则结果数组也具有固定大小。
-spec set(I :: array_indx(), Value :: Type, Array :: array(Type)) -> array(Type).
将数组的条目 I
设置为 Value
。
如果 I
不是非负整数,或者如果数组具有固定大小且 I
大于最大索引,则调用将失败并出现原因 badarg
。
如果数组没有固定大小,且 I
大于 size(Array)-1
,则数组会增长到大小 I+1
。
-spec size(Array :: array()) -> non_neg_integer().
获取数组中条目的数量。条目从 0
到 size(Array)-1
编号。因此,这也是保证以前未设置的第一个条目的索引。
另请参阅 set/3
、sparse_size/1
。
-spec sparse_foldl(Function, InitialAcc :: A, Array :: array(Type)) -> B when Function :: fun((Index :: array_indx(), Value :: Type, Acc :: A) -> B).
使用指定的函数和初始累加器值折叠数组元素,跳过默认值的条目。元素按照从最低索引到最高索引的顺序访问。
如果 Function
不是函数,则调用将失败并出现原因 badarg
。
另请参阅 foldl/3
、sparse_foldr/3
。
-spec sparse_foldr(Function, InitialAcc :: A, Array :: array(Type)) -> B when Function :: fun((Index :: array_indx(), Value :: Type, Acc :: A) -> B).
使用指定的函数和初始累加器值从右到左折叠数组元素,跳过默认值的条目。元素按照从最高索引到最低索引的顺序访问。
如果 Function
不是函数,则调用将失败并出现原因 badarg
。
另请参阅 foldr/3
、sparse_foldl/3
。
-spec sparse_map(Function, Array :: array(Type1)) -> array(Type2) when Function :: fun((Index :: array_indx(), Type1) -> Type2).
将指定的函数映射到每个数组元素,跳过默认值的条目。元素按照从最低索引到最高索引的顺序访问。
如果 Function
不是函数,则调用将失败并出现原因 badarg
。
另请参阅 map/2
。
-spec sparse_size(Array :: array()) -> non_neg_integer().
获取数组中直到最后一个非默认值条目的条目数。也就是说,如果 I
是数组中最后一个非默认值条目,则返回 I+1
;如果不存在此类条目,则返回零。
-spec sparse_to_list(Array :: array(Type)) -> [Value :: Type].
将数组转换为列表,跳过默认值的条目。
另请参阅 to_list/1
。
-spec sparse_to_orddict(Array :: array(Type)) -> indx_pairs(Value :: Type).
将数组转换为成对的有序列表 {Index, Value}
,跳过默认值的条目。
另请参阅 to_orddict/1
。
-spec to_list(Array :: array(Type)) -> [Value :: Type].
将数组转换为列表。
另请参阅 from_list/2
、sparse_to_list/1
。
-spec to_orddict(Array :: array(Type)) -> indx_pairs(Value :: Type).
将数组转换为成对的有序列表 {Index, Value}
。