12

私は clojure を初めて使用します。最初はClojure.orgcheatbookを使用しています。

conjリストとベクターの動作が異なる正確な理由を知りたいです。

(conj [1 2 3] 4)
[1 2 3 4]

(conj (list 3 2 1) 4) 
(4 3 2 1)

リストで使用すると、最初の場所に要素が追加され、ベクターを使用すると最後の場所に追加されます。

4

1 に答える 1

24

このconj手順は、「具象型に応じて異なる「場所」に」新しい要素を追加します。特に、特定conjのデータ構造の最も効率的な場所に新しい要素を追加しています。

単一リンクのリストでは、新しい要素を挿入する最も安価な場所は先頭です。挿入ポイントを見つけるためにリストをトラバースする必要はなく、新しい要素をリストの最初の要素に接続するだけです。

ベクトルでは、最も安価な場所は最後です。新しい要素のためのスペースを空けるために残りの要素をシフトまたは移動する必要はありません。また、ベクトルが現在の長さよりも実際のサイズが大きい余分な空き領域で作成されている場合(一時的なベクトル と の場合はそうですが、conj!永続的なベクトルの場合はそうではありません)、最初の空き位置に新しい要素を追加し、その長さを 1 単位ずつ増やすだけです。

于 2013-07-28T17:14:07.537 に答える