批里批里 (゜-゜)つ🍺 干杯~|

七つ一旋桜

园龄:4年2个月粉丝:6关注:3

📂笔记
🔖golang
2023-01-17 23:52阅读: 37评论: 0推荐: 0

golang实现set

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 {
    _, c := s[v]

    return c
}

// 转换为切片
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))
}

本文作者:Miraizu的笔记

本文链接:https://www.cnblogs.com/poifa/p/17058967.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   七つ一旋桜  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起