erlang 是否列出Cons-Into函数?

ar7v8xwq  于 2022-12-16  发布在  Erlang
关注(0)|答案(3)|浏览(98)

我经常想把一个列表中的每个元素都合并到一个现有的列表中。

MyList = [3,2,1],
MyNewElements = [4,5,6],
MyNewList = lists:foldl(fun(A, B) -> [A | B] end, MyList, MyNewElements).
%% [6,5,4,3,2,1]

假设MyList有1 M个元素,而MyNewElements只有几个元素,我希望高效地完成此操作。
我不知道这些函数中的哪一个--如果有的话--做了我想做的事情:https://www.erlang.org/doc/man/lists.html

tzdcorbm

tzdcorbm1#

在一个长列表的开头添加一个短列表的代价很小--++操作符的执行时间与第一个列表的长度成正比,第一个列表被复制,第二个列表作为尾部添加,不做修改。
在您的示例中,这将是:

lists:reverse(MyNewElements) ++ MyList

(The lists:reverse/1的执行时间也与参数的长度成比例。)

iovurdzv

iovurdzv2#

除了已经提供的选择外,另一个选择是

NewDeepList = [MyList | DeepList]

并修改阅读/遍历以能够处理[[element()]]而不是[element()]

92dk7w1h

92dk7w1h3#

因为erlang是函数语言,不同于c、javascript,它是复制变量并修改变量,而不是简单的修改变量,所以不可能压缩到o(A),length(A)是新增元素的长度。

相关问题