golang为什么我们没有一套数据结构[关闭]

问题描述 投票:81回答:4

我正在尝试解决“去编程语言”练习#1.4,这需要我有一套。我可以创建一个集合类型,但为什么语言没有附带? go,来自谷歌,guava也来自哪里,为什么语言设计师不选择添加对基础数据结构的支持?为什么强迫你的用户创建自己的实现为一个基本的集合?

data-structures go set
4个回答
57
投票

部分原因是因为Go没有泛型(所以你需要为每种类型设置一种类型,或者反复使用反射,这是相当低效的)。

部分地,因为如果您只需要“添加/删除单个元素到一个集合”和“相对节省空间”,您可以通过使用map[yourtype]bool(并将值设置为true)来获得相当多的元素。设置)或者,为了提高空间效率,您可以使用空结构作为值,并使用_, present = the_setoid[key]检查是否存在。


43
投票

一个原因是从地图创建集合很容易:

s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element 
delete(s, 2) // remove element

联盟

s_union := map[int]bool{}
for k, _ := range s1{
    s_union[k] = true
}
for k, _ := range s2{
    s_union[k] = true
}

路口

s_intersection := map[int]bool{}
for k,_ := range s1 { 
  if s2[k] {
    s_intersection[k] = true
  }
}

实现所有其他设置操作并不是那么难。


4
投票

另一种可能性是使用位组,至少有一个package或者你可以使用内置的big包。在这种情况下,基本上您需要定义一种将对象转换为索引的方法。


2
投票

就像Vatine写道:由于缺乏泛型,它必须是语言的一部分而不是标准库。为此你必须用关键字集,联合,交集,差异,子集污染语言......

另一个原因是,根本不清楚集合的“正确”实现是什么:

  1. 有一种功能方法: func IsInEvenNumbers(n int) bool { if n % 2 == 0 { return true } return false }

这是一组甚至整数。它具有非常高效的查找和联合,交叉,差异和子集可以通过功能组合轻松完成。

  1. 或者你像达利一样表现出类似的方式。

地图没有这个问题,因为您存储了与该值相关联的内容。

© www.soinside.com 2019 - 2024. All rights reserved.