檢視原始碼 array (stdlib v6.2)
功能性、可擴展的陣列。
陣列可以有固定大小,或者可以根據需要自動增長。對於未明確設定的條目,會使用預設值。
陣列使用零基底索引。這是一個經過深思熟慮的設計選擇,與其他 Erlang 資料結構(例如,元組)不同。
除非使用者在建立陣列時指定,否則預設值為原子 undefined
。未設定的條目與明確設定為與預設值相同的值的條目之間沒有差異(比較 reset/2
)。如果您需要區分未設定和已設定的條目,請確保預設值不會與已設定條目的值混淆。
陣列永遠不會自動縮小。如果索引 I
已成功用於設定條目,則範圍 [0,I]
中的所有索引都保持可存取,除非陣列大小透過呼叫 resize/2
明確變更。
範例
建立一個固定大小的陣列,其中 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}
。