Rumah >pembangunan bahagian belakang >Golang >Mengatasi kaedah Pop().

Mengatasi kaedah Pop().

WBOY
WBOYke hadapan
2024-02-10 17:18:07537semak imbas

重写 Pop() 方法

editor php Banana hari ini akan memperkenalkan kepada anda cara menulis semula kaedah Pop(). Dalam pengaturcaraan, kaedah Pop() digunakan untuk mengalih keluar dan mengembalikan elemen terakhir tatasusunan. Walau bagaimanapun, kadangkala kita perlu menyesuaikan kaedah Pop() untuk memenuhi keperluan khusus. Dengan mengatasi kaedah Pop(), kami boleh menambah logik tambahan atau mengubah suai elemen yang dikembalikan agar lebih sesuai dengan kod kami. Artikel ini akan memperkenalkan secara terperinci cara mengatasi kaedah Pop() dan memberikan beberapa contoh untuk membantu memahami. Mari mulakan!

Kandungan soalan

Di bawah pemasangan go, mereka mempunyai contoh baris gilir keutamaan dalam container/heap/example_pq_test.go Saya menampal kandungan keseluruhan fail supaya saya boleh bertanya kaedah 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
}

Jika saya mempunyai kaedah pop() seperti berikut (tanpa mencipta salinan dalam kepingan asal), apakah bahaya yang boleh berlaku atau adakah terdapat kesilapan

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
}

Saya percaya kaedah pop() asal, yang menghiris old := *pq, mencipta salinan dalam (memperuntukkan tatasusunan asas baharu). Adakah ini benar? pop() 方法,这一行为切片 old := *pq 创建一个深层副本(分配一个新的底层数组)。这是真的吗?

解决方法

make函数创建的对象,这里是mapslice

Penyelesaian

So old := *pqObjek yang dicipta oleh fungsi make, di sini map dan slice, lebih seperti penunjuk kepada lokasi data, dan bukannya data itu sendiri.

berkelakuan lebih seperti 🎜alias🎜 daripada salinan data. 🎜

Atas ialah kandungan terperinci Mengatasi kaedah Pop().. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam