Naprawdę lubię google golang, ale czy ktoś mógłby wyjaśnić, jakie są uzasadnienia dla implementatorów, którzy opuścili podstawową strukturę danych, taką jak zestawy ze standardowej biblioteki?
69
Naprawdę lubię google golang, ale czy ktoś mógłby wyjaśnić, jakie są uzasadnienia dla implementatorów, którzy opuścili podstawową strukturę danych, taką jak zestawy ze standardowej biblioteki?
Odpowiedzi:
Jednym z potencjalnych powodów tego pominięcia jest to, że bardzo łatwo jest modelować zestawy za pomocą mapy.
Szczerze mówiąc, myślę, że to trochę przeoczenie, ale patrząc na Perla, historia jest dokładnie taka sama. W Perlu dostajesz listy i tablice skrótów, w Go - tablice, plastry i mapy. W Perlu na ogół używasz tablicy mieszającej dla wszystkich problemów związanych z zestawem, to samo dotyczy Go.
Przykład
aby naśladować zbiór int w Go, definiujemy mapę:
Dodanie czegoś jest tak proste jak:
Usunięcie czegoś jest po prostu
Potencjalną niezręczność tego konstruktu łatwo można oderwać:
I usunąć i uzyskać można zdefiniować podobnie, mam pełną realizację tutaj . Główną wadą tutaj jest fakt, że go nie ma leków generycznych. Można to jednak zrobić
interface{}
w takim przypadku, w którym uzyskałbyś wyniki get.źródło
map[int]bool
jednego można użyćmap[int]struct{}
zamiast tego. Wolę ostatni.map[int]struct{}
..struct{}
Zajmuje 0 bajtów.map[int]struct{}
nie możesz zrobić,if mymap["key"] {
aby sprawdzić członkostwo. Google zaleca użyciebool
(wyszukaj „Zestaw można zaimplementować”).Myślę, że ma to związek z
golang
prostotą.set
y stają się bardzo użyteczne zdifference
,intersection
,union
,issubset
, i tak dalej .. metod. Być możegolang
zespół uznał, że to za dużo dla jednej struktury danych. Ale poza tym jest „głupi zestaw”, który tylko maadd
,contains
iremove
może być łatwo powielane zmap
jak wyjaśnił @jozefg.źródło
Poprzednia odpowiedź działa TYLKO JEŻELI klucz jest wbudowany. Aby uzupełnić poprzednią odpowiedź, oto sposób na zaimplementowanie zestawu, którego elementami są typy zdefiniowane przez użytkownika:
źródło
type mySet map[IntPoint]bool
działa doskonale. Wszystko, co jest wymagane od typu klucza używanego na mapie, to , że ma==
i!=
. Równość typów struktur jest dobrze zdefiniowana, twojaEquals
metoda powinna być sprawiedliwap1 == p2
.Contains
zajmuje czas liniowy, aaMap[]
trwa cały czas, niezależnie od liczby członków. Lepsze rozwiązanie stworzyłoby wewnętrznie unikatowy klucz oparty na zawartości każdego elementu i wykorzystywałby zapytania w trybie ciągłymmap
dostarczane przez ten typ. Istnieją nawet szybsze rozwiązania, które uwzględniają zachowanie pamięci podręcznej itp.