erlang 字符串的操作

举报
橘座 发表于 2020/02/12 03:57:34 2020/02/12
【摘要】 字符串有点像一个整数链表。对于每个字符,除了自身占用存储空间外,还需要保存一个指向剩余列表的链接。此外,如果想向列表中增加元素——不管是中间还是末尾——都必须要遍历整个列表直到需要修改的那个位置,然后才能增加元素。不过,向列表中前置增加(prepend)元素时,有所不同:A = [a] B = [b|A] = [b,a] C = [c|B] = [c,b,a] 进行列表前置操作时,A、B或者...

字符串有点像一个整数链表。

对于每个字符,除了自身占用存储空间外,还需要保存一个指向剩余列表的链接。此外,如果想向列表中增加元素——不管是中间还是末尾——都必须要遍历整个列表直到需要修改的那个位置,然后才能增加元素。不过,向列表中前置增加(prepend)元素时,有所不同:

A = [a] B = [b|A] = [b,a] C = [c|B] = [c,b,a] 进行列表前置操作时,A、B或者C中的内容都不需要改写。可以把C的表示形式看作[c,b,a]、[c|B]或者[c|[b|[a]]](还有其他形式)。从最后一种形式中可以看出,列表末尾处的A的形状和其定义时的形状完全一样,B也是如此。下面是追加(append)操作时的形状变化:

A = [a] B = A ++ [b] = [a] ++ [b] = [a|[b]] C = B ++ [c] = [a|[b]] ++ [c] = [a|[b|[c]]] 你看到那些改写操作了吗?当创建B时,需要改写A。在生成C时,必须要改写B(包括它所含有的[a|...]部分)。如果用同样的方式再定义一个D,那么就需要改写C。如果字符串很长,那么这种方式就非常低效,并且会产生大量的垃圾,需要Erlang VM进行清理。

A = [a]


B = [b|A] = [b,a] 推荐


B = [b] ++ A = [b] ++ [a] = [b|[a]] 不推荐


补充一句:

1> [b|[a]] == [b,a].

true

2> [b|[a]] == [b,[a]].

false


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。