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 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步