Mengatasi kaedah Pop().

WBOY
Lepaskan: 2024-02-10 17:18:07
ke hadapan
494 orang telah melayarinya

重写 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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!