Maison > développement back-end > Golang > le corps du texte

Remplacer la méthode Pop()

WBOY
Libérer: 2024-02-10 17:18:07
avant
491 Les gens l'ont consulté

重写 Pop() 方法

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!

Contenu de la question

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
}
Copier après la connexion

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
}
Copier après la connexion

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函数创建的对象,这里是mapslice

Solution

So old := *pqLes 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.

se comporte plus comme un 🎜alias🎜 que comme une copie de données. 🎜

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!