2013-07-28 23 views
11

Jestem nowy na clojure, początkowo przechodzę przez Clojure.org i cheatbook.Różnica w zachowaniu conj na wektorach i listach w Clojure

Chcę wiedzieć, jaki jest dokładny powód innego zachowania conj na liście i wektorze.

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

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

gdy używam go z listy to dodanie elementu na pierwszym miejscu i to z wektorem dodać w poprzednim miejscu.

+1

Napisałem krótkie podsumowanie zastosowań 'conj',' cons' i kilku innych metod [tutaj] (https://medium.com/@greg_63957/conj-cons-concat-oh-my- 1398a2981eab) – GLee

Odpowiedz

22

Procedura conj dodaje nowe elementy "w różnych" miejscach "w zależności od rodzaju betonu". W szczególności, conj dodaje nowe elementy w najbardziej wydajnym miejscu dla danej struktury danych.

Na pojedynczej liście najtańsze miejsce do wstawienia nowego elementu znajduje się na czele - nie trzeba przechodzić przez listę, aby znaleźć punkt wstawienia, wystarczy połączyć nowy element z pierwszym elementem listy.

W wektorze najtańsze miejsce znajduje się na końcu - nie ma potrzeby przesuwania ani przesuwania pozostałych elementów, aby zrobić miejsce dla nowego elementu, a jeśli wektor został utworzony z dodatkową wolną przestrzenią o rzeczywistej wielkości większej niż jego aktualna długość (jak w przypadku wektorów przejściowych i conj!, ale nie w przypadku trwałych wektorów), jest to prosta sprawa dodania nowego elementu w pierwszej wolnej pozycji i zwiększania jego długości o jedną jednostkę.

+0

czy możesz zaproponować dobry tutorial dla clojure? – swapy

+0

Zobacz [post] (http://stackoverflow.com/questions/599519/which-tutorial-on-clojure-is-best) –

+1

Koniec ostatniego zdania - o dodatkowej przestrzeni - dotyczy tylko wektorów przejściowych i 'conj!'. Wektory trwałe nigdy nie są tworzone z dodatkową przestrzenią i nigdy nie są modyfikowane w miejscu (więc nie zwiększają liczby itp.). –

Powiązane problemy