Entfernen und hinzufügen von Elementen zum array in lang GEHEN
Ich habe 2 arrays deklariert als :
var input []string
und var output []string
.
Den Eingabe-array ist gefüllt mit einigen IDs zunächst. Output-array ist NULL.
Nach jeder iteration möchte ich Entferne ein zufälliges element aus der Eingabe-array und fügen Sie die Ausgabe-array.
Am Ende alle Elemente im Ausgabe-array wird derselbe sein wie der input-array - (aber mit unterschiedlichen Bestellung(Indexierung)).
for index := 0; index < len(input); index++ {
if !visited[index] {
//do something
}
}
output[#iteration index] = input[current index]
Wenn ich versuche, dies zu tun, bekomme ich array out of bounds error
.
InformationsquelleAutor fnaticRC ggwp | 2015-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die
output
array, das Sie verwenden müssenappend
oder verteilen Sie es mit einer anfänglichen Kapazität entsprechend der Größe derinput
.wäre meine Empfehlung, weil
append
verursacht einen Haufen unnötige Umschichtungen und Sie bereits wissen, welche Kapazität Sie benötigen, da es basiert auf derinput
.Die andere Sache wäre:
Aber wie ich schon sagte, von dem, was ich beobachtet habe append wächst die anfängliche Kapazität exponentiell. Diese werden Basis 2 wenn Sie noch nicht angegeben, was bedeutet, dass Sie tun werden einige unnötige Umschichtungen vor erreichen der gewünschten Kapazität.
Gibt es eine Möglichkeit zum Anhängen an eine Scheibe ohne Neuzuweisung?
InformationsquelleAutor evanmcdonnal
Finden Sie ein paar nützliche tricks bei der golang/SliceTricks.
Seit der Einführung der
append
built-in, die meisten der Funktionalität dercontainer/vector
- Paket, das entfernt wurde, in Go 1, können repliziert werden, mitappend
undcopy
.Hier sind die Vektor-Methoden und Ihre Scheibe-manipulation Analoga:
AppendVector
Kopieren
Schneiden
Löschen
Löschen ohne Erhaltung der Reihenfolge
HINWEIS, Wenn der Typ des Elements ist eine Zeiger oder ein struct mit Zeiger-Felder, die Notwendigkeit, Müll gesammelt, die oben genannten Implementierungen von
Cut
undDelete
haben ein Potenzial Speicherverlust problem: einige Elemente mit Werten, die noch verwiesen wird, durch den slice -a
und kann somit nicht erfasst werden. Der folgende code kann dieses problem beheben:Erweitern
Erweitern
Einfügen
HINWEIS Die zweite
append
erstellt eine neue Scheibe mit seiner eigenen zugrunde liegenden Speicher und kopiert die Elemente ina[i:]
um die Scheibe, und diese Elemente sind dann kopieren zurück zu schneidena
(von der erstenappend
). Die Schaffung der neuen Scheibe (und damit Speicher-Müll) und die zweite Kopie kann vermieden werden, indem ein alternativer Weg:InsertVector
Pop
Pop Zurück
Push
Push-Vorne
Shift
Unshift
Weitere Tricks
Filterung ohne Zuweisung
Dieser trick nutzt die Tatsache, dass eine Scheibe Aktien der gleichen backing-array und Kapazität als das original, so dass der Speicher wiederverwendet wird, der für die gefilterten Scheibe. Natürlich, der ursprüngliche Inhalt geändert werden.
Rückwärtsfahren
Ersetzen Sie den Inhalt der Scheibe mit den gleichen Elementen, aber in umgekehrter Reihenfolge:
Das gleiche, außer mit zwei Indizes:
Mischen
Fisher–Yates-Algorithmus:
InformationsquelleAutor TonnyL