首页 > 其他分享 >golang实现set

golang实现set

时间:2023-01-18 00:01:07浏览次数:35  
标签:set struct 实现 fmt golang Set func sb

golang没有原生的set

要实现set可以使用map来简易实现

定义一个Set可以这么定义

type Set[T comparable] struct {
    set map[T]struct{}
}

为什么map的值类型用struct{}?

因为struct{}不占内存

package main

import (
    "fmt"
    "strings"
)

type Set[T comparable] struct {
    set map[T]struct{}
}

// 新建Set对象
func NewSet[T comparable]() *Set[T] {
    s := new(Set[T])
    s.set = make(map[T]struct{})
    return s
}

// 插入数据
func (s *Set[T]) Insert(v T) {
    s.set[v] = struct{}{}
}

// 删除数据
func (s *Set[T]) Pop(v T) {
    delete(s.set, v)
}

// 判断包含关系
func (s *Set[T]) Contains(v T) bool {
    for k := range s.set {
        if k == v {
            return true
        }
    }
    return false
}

// 转换为切片
func (s *Set[T]) ToList() []T {
    res := make([]T, 0, len(s.set))
    for k := range s.set {
        res = append(res, k)
    }
    return res
}

func main() {
    // 初始化
    s := NewSet[int]()
    
    // 测试插入操作
    for i := 0; i < 10; i++ {
        s.Insert(i)
    }
    sb := new(strings.Builder)
    for _, v := range s.ToList() {
        sb.WriteString(fmt.Sprintf("%v, ", v))
    }
    fmt.Println(sb.String())
    sb.Reset()
    
    // 测试删除操作
    s.Pop(0)
    for _, v := range s.ToList() {
        sb.WriteString(fmt.Sprintf("%v, ", v))
    }
    fmt.Println(sb.String())
    
    // 测试包含关系
    fmt.Println(s.Contains(1))
}

标签:set,struct,实现,fmt,golang,Set,func,sb
From: https://www.cnblogs.com/poifa/p/17058967.html

相关文章