go set如何表示
一、Go 的数据结构
Go 内置的数据结构并不多。最常用的两种数据结构分别是 slice 和 map,即切片和映射。( 切片的底层就是数组,因为有了切片比较少用)
除了 Go 内置的数据结构,还有一些数据结构是由 Go 的官方 container 包提供,如 heap 堆、list 双向链表和ring 回环链表。(了解原理,看看文档也就会用了)
二、set
set 和 bitset ,Go 当前还没有以任何形式提供。(编程语言中没有go的选项)
package set import ( "fmt" "sort" ) //空缓存 type Empty struct{} var empty Empty //构造一个set,首先定义set的类型 type Set struct { m map[int]Empty } //产生set的工厂 func SetFactory() *Set { return &Set{ m: map[int]Empty{}, } } //添加元素 func (s *Set) Add(val int) { //表示给 Set声明一个方法 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() map[int]Empty { return s.m //for v := range s.m { // fmt.Println(v) //} } //set 转 list func (s *Set) SetToList() []int { var a []int for v := range s.m { a = append(a, v) } return a } //排序输出 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) } } //判读key存在 func (s *Set) KeyExist(key int) bool { if _, ok := s.m[key]; ok { return true } else { return false } } //set 并集 func (s *Set) Union(b *Set) { for key, _ := range b.m { s.m[key] = empty } }
三、bitset
bitset 的话,https://godoc.org/github.com/willf/bitset#example-BitSet-Len (go文档) https://github.com/yourbasic/bit/blob/master/set.go 这个也可以参考
bitset 中每个数子用一个 bit 即能表示,对于一个 int8 的数字,我们可以用它表示 8 个数字,能帮助我们大大节省数据的存储空间。
bitset 最常见的应用有 bitmap 和 flag,即位图和标志位。
bitset 工作中很少用到 https://juejin.im/post/5ceffeddf265da1bc8540df5