l'éditeur php Banana vous présentera aujourd'hui comment réécrire la méthode Pop(). En programmation, la méthode Pop() est utilisée pour supprimer et renvoyer le dernier élément d'un tableau. Cependant, nous devons parfois personnaliser la méthode Pop() pour répondre à des besoins spécifiques. En remplaçant la méthode Pop(), nous pouvons ajouter une logique supplémentaire ou modifier les éléments renvoyés pour mieux les adapter à notre code. Cet article présentera en détail comment remplacer la méthode Pop() et donnera quelques exemples pour vous aider à comprendre. commençons!
Sous l'installation de go, ils ont un exemple de file d'attente prioritaire dans container/heap/example_pq_test.go
Je colle le contenu de l'intégralité du fichier pour pouvoir demander la méthode pop().
// copyright 2012 the go authors. all rights reserved. // use of this source code is governed by a bsd-style // license that can be found in the license file. // this example demonstrates a priority queue built using the heap interface. package heap_test import ( "container/heap" "fmt" ) // an item is something we manage in a priority queue. type item struct { value string // the value of the item; arbitrary. priority int // the priority of the item in the queue. // the index is needed by update and is maintained by the heap.interface methods. index int // the index of the item in the heap. } // a priorityqueue implements heap.interface and holds items. type priorityqueue []*item func (pq priorityqueue) len() int { return len(pq) } func (pq priorityqueue) less(i, j int) bool { // we want pop to give us the highest, not lowest, priority so we use greater than here. return pq[i].priority > pq[j].priority } func (pq priorityqueue) swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] pq[i].index = i pq[j].index = j } func (pq *priorityqueue) push(x any) { n := len(*pq) item := x.(*item) item.index = n *pq = append(*pq, item) } func (pq *priorityqueue) pop() any { old := *pq n := len(old) item := old[n-1] old[n-1] = nil // avoid memory leak item.index = -1 // for safety *pq = old[0 : n-1] return item } // update modifies the priority and value of an item in the queue. func (pq *priorityqueue) update(item *item, value string, priority int) { item.value = value item.priority = priority heap.fix(pq, item.index) } // this example creates a priorityqueue with some items, adds and manipulates an item, // and then removes the items in priority order. func example_priorityqueue() { // some items and their priorities. items := map[string]int{ "banana": 3, "apple": 2, "pear": 4, } // create a priority queue, put the items in it, and // establish the priority queue (heap) invariants. pq := make(priorityqueue, len(items)) i := 0 for value, priority := range items { pq[i] = &item{ value: value, priority: priority, index: i, } i++ } heap.init(&pq) // insert a new item and then modify its priority. item := &item{ value: "orange", priority: 1, } heap.push(&pq, item) pq.update(item, item.value, 5) // take the items out; they arrive in decreasing priority order. for pq.len() > 0 { item := heap.pop(&pq).(*item) fmt.printf("%.2d:%s ", item.priority, item.value) } // output: // 05:orange 04:pear 03:banana 02:apple }
Si j'ai une méthode pop() comme ci-dessous (sans créer une copie complète de la tranche originale), quel mal cela pourrait-il causer ou y a-t-il une erreur
func (pq *PriorityQueue) Pop2() any { n := len(*pq) item := (*pq)[n-1] (*pq)[n-1] = nil // avoid memory leak item.index = -1 // for safety *pq = (*pq)[: n-1] return item }
Je crois que la méthode pop()
originale, qui découpe old := *pq
, crée une copie complète (alloue un nouveau tableau sous-jacent). est-ce réel? pop()
方法,这一行为切片 old := *pq
创建一个深层副本(分配一个新的底层数组)。这是真的吗?
make
函数创建的对象,这里是map
和slice
So old := *pq
Les objets créés par la fonction make
, ici map
et slice
, ressemblent davantage à des pointeurs vers des emplacements de données, plutôt qu'à des données elles-mêmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!