Supprimer et ajouter des éléments à un tableau en ALLER lang
J'ai 2 tableaux déclarés comme :
var input []string
et var output []string
.
Le tableau d'entrée est remplie avec des Id d'abord. Le tableau de sortie est NULLE.
Après chaque itération, je veux supprimer un élément aléatoire à partir d'une entrée de tableau et l'ajouter sur le tableau de sortie.
À la fin de tous les éléments dans le tableau de sortie sera le même que l'entrée de tableau (mais avec un autre ordre(indexation)).
for index := 0; index < len(input); index++ {
if !visited[index] {
//do something
}
}
output[#iteration index] = input[current index]
Quand j'essaie de faire ceci, j'obtiens array out of bounds error
.
OriginalL'auteur fnaticRC ggwp | 2015-11-20
Vous devez vous connecter pour publier un commentaire.
Pour la
output
tableau, vous devez utiliserappend
ou allouer avec une capacité initiale en fonction de la taille deinput
.serait ma recommandation, car
append
provoque un tas de inutile réaffectations et vous savez déjà ce que la capacité dont vous avez besoin, car il est basé sur lainput
.L'autre chose, ce serait:
Mais comme je l'ai dit, de ce que j'ai observé ajouter pousse la capacité initiale de façon exponentielle. Ce sera la base de 2 si vous n'avez pas spécifié ce qui signifie que vous allez faire plusieurs inutiles réaffectations avant d'atteindre la capacité souhaitée.
Est-il possible d'ajouter une tranche sans réaffectation?
OriginalL'auteur evanmcdonnal
Vous pourriez trouver quelques astuces utiles à golang/SliceTricks.
Depuis l'introduction de la
append
construit, la plupart des fonctionnalités de lacontainer/vector
paquet, qui a été supprimée en 1, peut être répliqué à l'aide deappend
etcopy
.Voici le vecteur des méthodes et de leur tranche de manipulation analogues:
AppendVector
Copie
Couper
Supprimer
Supprimer sans le maintien de l'ordre
NOTE Si le type de l'élément est un pointeur ou une structure (struct) avec le pointeur de champs, qui doivent être des ordures, le ci-dessus implémentations de
Cut
etDelete
ont un potentiel fuite de mémoire problème: certains éléments avec des valeurs sont encore référencés par tranchea
et donc ne peuvent pas être collectées. Le code suivant peut résoudre ce problème:Développez
Étendre
Insérer
NOTE La deuxième
append
crée une nouvelle tranche avec ses propres sous-jacente de stockage et de copies d'éléments dansa[i:]
de cette tranche, et ces éléments sont alors copiés sur la tranchea
(par la premièreappend
). La création de la nouvelle tranche (et donc la mémoire garbage) et la deuxième copie peut être évité en utilisant un autre moyen:InsertVector
Pop
De La Pop De Retour
Pousser
Pousser
Maj
Unshift
Vous Trouverez D'Autres Astuces
De filtrage sans allocation
Cette astuce utilise le fait qu'une tranche partage le même support de tableau et de la capacité que l'original, de sorte que le stockage est réutilisée pour l'filtré tranche. Bien sûr, le contenu original est modifié.
Inverser
Pour remplacer le contenu d'une tranche avec les mêmes éléments mais dans l'ordre inverse:
La même chose, sauf avec deux indices:
Brassage
De Fisher–Yates algorithme:
OriginalL'auteur TonnyL