erlang 字符串的操作
字符串有点像一个整数链表。
对于每个字符,除了自身占用存储空间外,还需要保存一个指向剩余列表的链接。此外,如果想向列表中增加元素——不管是中间还是末尾——都必须要遍历整个列表直到需要修改的那个位置,然后才能增加元素。不过,向列表中前置增加(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
- 点赞
- 收藏
- 关注作者
评论(0)