Clojure 배우기, 파트 VI

우리는 이미 목록을 사용하는 방법과 Clojure에서 이 데이터 구조의 중요성에 대해 배웠습니다. 이제 우리는 또 다른 중요한 데이터 구조인 벡터를 배울 것입니다.

벡터란 무엇입니까?



목록으로서의 벡터는 모든 값을 보유할 수 있는 불변의 영구 데이터 모음입니다. 값 모음을 전달하거나 대괄호 사이에 직접 값을 전달하는 vec 함수를 사용하여 생성할 수 있습니다.

;; (vec collection)
(vec '("Red" "Green" "Blue"))
;; returns => ["Red" "Green" "Blue"]

["Gold" "Silver" "Crystal"]
;; returns => ["Gold" "Silver" "Crystal"]


벡터 대 목록



벡터와 목록은 모두 데이터 모음이지만 각각의 작동 방식이 많이 다릅니다. 그들 사이에서 알아차릴 수 있는 첫 번째 주요 차이점은 목록은 괄호를 사용하여 작성하는 반면 벡터는 대괄호를 사용하여 작성한다는 것입니다.

'("List" 1 2 3)
;; returns => ("List" 1 2 3)

["Vector" 1 2 3]
;; returns => ["Vector" 1 2 3]


지금 보기에는 동일한 작업을 수행하는 것처럼 보이지만 이러한 컬렉션의 기본 데이터 구조는 다르며 실제 사용에 많은 차이가 있습니다.

(class '("List" 1 2 3))
;; returns => clojure.lang.PersistentList

["Vector" 1 2 3]
;; returns => clojure.lang.PersistentVector


우리가 보는 것처럼 목록은 값과 다음 값에 대한 참조를 보유하는 메모리의 비연속적인 값인 반면, 벡터는 메모리에서 연속적인 값이므로 요소가 인덱싱되고 nth 함수를 사용하여 인덱스 위치로 빠르게 액세스할 수 있습니다. .

;; (nth collection index)

(nth ["Charmander" "Pikachu" "Buterfree"] 0)
;; returns => "Charmander"

(nth ["Charmander" "Pikachu" "Buterfree"] 2)
;; returns => "Buterfree"




Image: "Vectors representation" made by the author is copyleft material under unlicense.



값 추가



그들 사이의 또 다른 큰 차이점은 컬렉션에 요소를 추가하기 위해 conj 함수를 사용할 때입니다. 이 함수는 요소를 컬렉션에 더 빠르게 추가하기 때문입니다.
  • 목록에서 새 요소를 시작 부분에 추가하는 것이 더 빠릅니다. 다른 위치에 추가하기 위해 전체 목록을 살펴볼 필요가 없기 때문입니다.
  • 벡터에서 요소는 마지막 인덱스를 가져와서 추가하기 때문에 마지막 위치에 추가됩니다.



  • Image: "Conj vector vs list" made by the author is copyleft material under unlicense.



    몇 가지 예를 통해 이를 확인할 수 있습니다.

    (conj  '("Charmander" "Pikachu" "Buterfree") "Zubat")
    ;; returns => ("Zubat" "Charmander" "Pikachu" "Buterfree")
    
    (conj  ["Charmander" "Pikachu" "Buterfree"] "Zubat")
    ;; returns => ["Charmander" "Pikachu" "Buterfree" "Zubat"]
    


    벡터 및 목록



    n번째를 사용하여 위치에 따라 값에 효율적으로 액세스할 수 있지만 이전에 목록에서 본 함수를 사용할 수도 있습니다. 목록 및 기타 컬렉션과 마찬가지로 벡터를 반복하는 데 사용할 수 있습니다.

    첫 번째



    첫 번째 함수는 벡터의 시작 부분에 있는 요소를 반환합니다.

    (first ["Brock" "Misty" "Lt. Surge" "Erika"])
    ;; returns => "Brock"
    




    두 번째 함수는 벡터의 두 번째 요소를 반환합니다.

    (second ["Brock" "Misty" "Lt. Surge" "Erika"])
    ;; returns => "Misty"
    


    마지막



    마지막 함수는 벡터의 끝에 있는 요소를 반환합니다.

    (last ["Brock" "Misty" "Lt. Surge" "Erika"])
    ;; returns => "Erika"
    


    쉬다



    나머지 함수는 벡터를 첫 번째 요소 없이 목록으로 반환합니다.

    (rest ["Brock" "Misty" "Lt. Surge" "Erika"])
    ;; returns => ("Misty" "Lt. Surge" "Erika")
    


    벡터보다 목록을 사용해야 하는 경우는 언제입니까?



    항상 컬렉션의 시작이나 끝에서 값을 추가하고 검색하려는 경우 목록이 벡터보다 훨씬 효율적입니다.

    다른 한편으로, 중간 또는 인덱스 위치에서 값을 추가하고 검색해야 하는 경우 벡터가 목록보다 훨씬 효율적입니다.

    일반적인 조언은 일반적으로 대부분의 경우 목록보다 벡터가 더 자주 사용되므로 어떤 것을 사용할지 선택할 때 이를 고려해야 합니다.

    다음편에서 만나요!



    매우 유사해 보이고 매우 다르게 작동하는 2개의 다른 컬렉션을 갖는 것은 특히 이러한 데이터 구조가 어떻게 만들어지는지 모르는 경우 구걸할 때 약간 혼란스러울 수 있지만 Clojure에 익숙해지면 자연스럽게 될 것이라고 걱정하지 마십시오.

    좋은 웹페이지 즐겨찾기