日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go實現set類型的示例代碼_Golang

作者:小辣抓 ? 更新時間: 2023-03-28 編程語言

如何實現set

Go中是不提供Set類型的,Set是一個集合,其本質就是一個List,只是List里的元素不能重復。

Go提供了map類型,但是我們知道,map類型的key是不能重復的,因此,我們可以利用這一點,來實現一個set。那value呢?value我們可以用一個常量來代替,比如一個空結構體,實際上空結構體不占任何內存,使用空結構體,能夠幫我們節省內存空間,提高性能

下面看看兩種結構體的聲明方法

type Empty struct { }

func main(){
? ? empty := new(Empty)
? ? fmt.Println(unsafe.Sizeof(empty)) //8
}

這種形式的聲明會返回一個指向該結構體的指針

而下面這種結構體的聲明就是一個隨處可用的空緩存

var empty Empty
fmt.Println(unsafe.Sizeof(empty)) //0

構造一個Set

構造一個set,首先定義set的類型

//set類型
type Set struct {
    m map[int]Empty
}

為一個結構體類型,內部一個成員為一個map,這也是主要我們存儲值的容器

產生set的工廠

//返回一個set
func SetFactory() *Set{
    return &Set{
        m:map[int]Empty{},
    }
}

這里初始化一個set,內部的map置空

現在給該set類型添加幾個方法,分別為

  • Add 添加元素
  • Remove 刪除元素
  • Len 獲取set長度
  • Clear 清空set
  • Traverse 遍歷set
  • SortTraverse 有順序的遍歷Set

由于map自身的特性,在golang中它是由一個hash表做支持的,每個hash函數都會導致不同的遍歷順序,因此,golang要求程序不依賴于具體的hash函數實現,因此,每次遍歷map都會有不一樣的順序,然而,對于set來說,可能會要求提供一種有順序的遍歷。因此,這里提供一個有順序的遍歷方法

下面是具體的實現

//添加元素
func (s *Set) Add(val int) {
? ? s.m[val] = empty
}

//刪除元素
func (s *Set) Remove(val int) {
? ? delete(s.m, val)
}

//獲取長度
func (s *Set) Len() int {
? ? return len(s.m)
}

//清空set
func (s *Set) Clear() {
? ? s.m = make(map[int]Empty)
}

//遍歷set
func (s *Set) Traverse(){
? ? for v := range s.m {
? ? ? ? fmt.Println(v)
? ? }
}

//排序輸出?
func (s *Set) SortTraverse(){
? ? vals := make([]int, 0, s.Len())

? ? for v := range s.m {
? ? ? ? vals = append(vals, v)
? ? }

? ? //排序
? ? sort.Ints(vals)

? ? for _, v := range vals {
? ? ? ? fmt.Println(v)
? ? }
}

大家可以挨著挨著的打印測試,我這里就不再贅述了

原文鏈接:https://blog.csdn.net/HaoDaWang/article/details/80006059

欄目分類
最近更新