web-dev-qa-db-fra.com

Golang pourquoi n'avons-nous pas une structure de données définie

J'essaie de résoudre l'exercice "1.4 de la programmation de go" qui exige que je dispose d'un ensemble. Je peux créer un type de jeu, mais pourquoi la langue n'en contient-elle pas? go, venu de google, d'où provient aussi la goyave, pourquoi les concepteurs de langages n'ont-ils pas choisi d'ajouter le support des structures de données fondamentales? pourquoi forcer vos utilisateurs à créer leurs propres implémentations pour quelque chose d'aussi fondamental qu'un ensemble?

91
anjanb

En partie, parce que Go n'a pas de génériques (vous auriez donc besoin d'un type de jeu pour chaque type, ou de la réflexion, ce qui est plutôt inefficace).

En partie, parce que si tout ce dont vous avez besoin est "ajouter/supprimer des éléments individuels à un ensemble" et "relativement peu encombrant", vous pouvez en obtenir un bon nombre simplement en utilisant un map[yourtype]bool (et en définissant la valeur sur true pour tout élément de l'ensemble) ou, pour plus de gain de place, vous pouvez utiliser une structure vide comme valeur et utiliser _, present = the_setoid[key] pour vérifier la présence.

63
Vatine

Une des raisons est qu'il est facile de créer un ensemble à partir de la carte:

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

Syndicat

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

Intersection

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

Il n’est pas si difficile de mettre en œuvre toutes les autres opérations d’ensembles.

46
Salvador Dali

Une autre possibilité consiste à utiliser des ensembles de bits, pour lesquels il existe au moins un package ou vous pouvez utiliser le package intégré big . Dans ce cas, vous devez définir un moyen de convertir votre objet en index.

4
Will Fitzgerald

Comme l'a écrit Vatine: Comme il manque des génériques, il devrait faire partie du langage et non de la bibliothèque standard. Pour cela, vous devrez alors polluer la langue avec les mots-clés set, union, intersection, difference, subset ...

L'autre raison est que la "bonne" mise en œuvre d'un ensemble n'est pas claire du tout:

  1. Il y a une approche fonctionnelle:

    func IsInEvenNumbers(n int) bool {
        if n % 2 == 0 {
            return true
        }
       return false
    }
    

Ceci est un ensemble de tous même ints. Il a une recherche très efficace et l'union, l'intersection, la différence et le sous-ensemble peuvent facilement être effectués par composition fonctionnelle.

  1. Ou vous faites une approche aisée comme Dali l'a montré.

Une carte n'a pas ce problème, car vous stockez quelque chose associé à la valeur.

2
0x434D53