2016-05-03 8 views
2

多くの関数型言語はcons operatorです。このメソッドは、不変のリストや配列のような型の結果を返します。新しい要素は一定時間内に末尾に付けられます。Swiftの "cons"演算子/関数/メソッドはどこにありますか?

疑似コードの例として、[1,2] : 3[1,2,3]と評価されます。

スウィフトは、償却された一定時間(いくつかの注意点を含む)で要素を追加するためにappendを持っています。ただし、appendには可変値Arrayが必要です。私は変更可能なArrayを不変のものから作成してappendを作成することができますが、私にはこれを行う既存の関数または演算子がないように思われ、償却された一定時間保証(共有されていない場合)を提供します。

答えて

3

これはcons演算子そのものではありませんが、+演算子を使用して、配列を "コンストラクタスタイル"の可変または不変配列に追加または前置することができます。連結された結果で新しい配列を構築します。 the Swift Language Guide - Collection Typesから

あなたが一緒に加算演算子と 互換性のある型を有する2つの既存のアレイを追加することによって、(+)を新しい配列を作成することができ一緒

を二つの配列を追加することにより、アレイの作成。新しい配列の タイプは、あなたが一緒に追加2つの配列の種類から推測される:

...

すなわち、

let foo = [1, 2] 
let bar = foo + [3] // [1, 2, 3], "cons(foo, 3)" 
let baz = [-1, 0] + bar // [-1, 0, 1, 2, 3], "cons([-1, 0], bar)" 

これがで実行されないことに注意してください、償却された一定時間は、我々は新しいメモリを割り当てる必要があるので、をコピーしてください。しかし、配列はSwiftの値型なので、不変配列の操作(新しい不変配列を作成するなど)が一定の時間内にどのように動作するかはわかりません。 (たとえ、時にはこれが遅れて実行されるかもしれない)。

したがって、上記の性能はをコピーすることによって、続いて既存の変更可能な1 .append/.appendContentsOfを用い新しいアレイを構築する異なるべきではありません。前のステップは償却された一定時間(アレイスペースの事前割り振りの指数関数的な増加による)で実行されますが、後者は線形時間で実行されます。

+0

[こんにちは!](http://stackoverflow.com/a/36635150/2547229)と回答ありがとうございます。私は、私が[線形時間 'スキャン'](http://stackoverflow.com/q/35160890/2547229)を望むなら、私はそれを受け入れなければならないと思う、私はそれを上に構築することはできません'reduce' :-) – Benjohn

+1

@Benjohn確かに、それはまるで--- wrt複雑さ--- Swift(reduce、map)の機能面の多くは、純粋な古い命令的に実装されたアルゴリズム(例えば、他のスレッドの 'scan'関数)と競合するために少し複雑です。 Wr.現在のスレッド:スウィフト配列が償却された線形時間で真に非突然変異(すなわち、新しいものを作成)できるかどうかはわかりません。 )。 – dfri

関連する問題