13092011 Go
IntVectorってのはsortのInterfaceを実装しているのでsortはなにも定義しなくても普通にOK
package main import ( "container/vector" "sort" "fmt" ) func main() { v := new(vector.IntVector) v.Push(3) v.Push(2) v.Push(4) v.Push(1) sort.Sort(v) fmt.Println(v) }
続いて、heapの実装。godoc container/heapすると
type Interface interface { sort.Interface Push(x interface{}) Pop() interface{} }
となっていて、sortのインターフェースとPush,Popが実装されていればイイ。IntVectorにはPushとPopも実装されているのでOKかなと思ったがこれはだめ。
package main import ( "container/vector" "container/heap" "fmt" ) func main() { v := new(vector.IntVector) heap.Push(v,3) heap.Push(v,2) heap.Push(v,4) heap.Push(v,1) fmt.Println(heap.Push(v)) fmt.Println(heap.Push(v)) fmt.Println(heap.Push(v)) fmt.Println(heap.Push(v)) }
これをコンパイルしようとすると
$ 6g myheap.go myheap.go:11: cannot use v (type *vector.IntVector) as type heap.Interface in function argument: *vector.IntVector does not implement heap.Interface (wrong type for Pop method) have Pop() int want Pop() interface { }
といって怒られる。じゃぁメソッドってオーバーライドできるのかなと。
package main import ( "container/vector" "container/heap" "fmt" ) func (v *vector.IntVector) Push (i interface{}) { v.Push(i.(int)) } func (v *vector.IntVector) Pop () interface{} { return v.Pop() } func main() { v := new(vector.IntVector) heap.Push(v,3) heap.Push(v,2) heap.Push(v,4) heap.Push(v,1) fmt.Println(heap.Push(v)) fmt.Println(heap.Push(v)) fmt.Println(heap.Push(v)) fmt.Println(heap.Push(v)) }
これをコンパイルしようとすると
$ 6g myheap.go myheap.go:9: method redeclared: vector.IntVector.Push method(p *vector.IntVector)func(x int) method(v *vector.IntVector)func(i interface { })
結局構造体を作ってこんな感じにした。
package main import ( "container/vector" "container/heap" "fmt" ) type heapq struct { hq vector.IntVector } func (h *heapq) Len() int { return h.hq.Len() } func (h *heapq) Less(i,j int) bool { return h.hq.Less(i,j) } func (h *heapq) Swap(i,j int) { h.hq.Swap(i,j) } func (h *heapq) Push(i interface{}){ h.hq.Push(i.(int)) } func (h *heapq) Pop() interface{} { return h.hq.Pop() } func main() { hq := new(heapq) heap.Push(hq,3) heap.Push(hq,2) heap.Push(hq,4) heap.Push(hq,1) fmt.Println(heap.Pop(hq)) fmt.Println(heap.Pop(hq)) fmt.Println(heap.Pop(hq)) fmt.Println(heap.Pop(hq)) }
結構面倒くさい。単に面倒くさい方法を選択しているだけなのだろうか?よくわからんです。