Go標準容器之List

2021-08-01 17:51:31 字數 4678 閱讀 9011

go的標準包container中包含了常用的容器型別,包括conatiner/listcontainer/heapcontainer/ring。本篇介紹conatiner/list

conatiner/list實現了乙個雙向鍊錶。使用起來與其他語言的動態列表非常相似,3秒鐘便可入門。

package main

import (

"container/list"

"fmt"

)func main()

}

包裡只匯出了兩個型別和乙個函式: c

onta

iner

/lis

t−−−

−−−−

−−−−

// 表示雙向列表

type list struct

// 表示列表中的元素

type element struct

// 建立list

func new() *list

下面詳細講解該包的用法。

先來看看element型別:co

ntai

ner/

list

−−−−

−−−−

−−−−

type element struct   // 儲存在該元素中的值

}

可以看到值的型別為 inte***ce{},因此element可以儲存任何值。

使用new來建立list,函式原型如下:co

ntai

ner/

list

−−−−

−−−−

−−−−

func new() *list
示例:

coll := list.new()
list匯出了六個方法用於新增元素:co

ntai

ner/

list

−−−−

−−−−

−−−−

// 追加新元素到末尾,返回該元素指標

func (l *list) pushback(v inte***ce{}) *element

// 追加另乙個列表到末尾

func (l *list) pushbacklist(other *list)

// 新增新元素到開頭,返回該元素指標

func (l *list) pushfront(v inte***ce{}) *element

// 新增另乙個列表到開頭

func (l *list) pushfrontlist(other *list)

// 在mark後面插入新元素,返回新元素指標

func (l *list) insertafter(v inte***ce{}, mark *element) *element

// 在mark前插入新元素,返回新元素指標

func (l *list) insertbefore(v inte***ce{}, mark *element) *element

示例:

// 追加元素到末尾

coll.pushback(1)

coll.pushback("gopher")

// 新增元素到開頭

coll.pushfront("cynhard")

two := coll.pushfront(2)

// 插入元素到two之前

before2 := coll.insertbefore("before2", two)

// 插入元素到two之後

after2 := coll.insertafter("after2", two)

coll2 := list.new()

coll2.pushback(3)

coll2.pushfront("tomcat")

// 追加另外乙個列表到末尾

coll.pushbacklist(coll2)

// 新增另外乙個列表到開頭

coll.pushfrontlist(coll2)

應注意到乙個列表中的元素的值的型別不必一致。

list匯出了四個方法用於移動元素:co

ntai

ner/

list

−−−−

−−−−

−−−−

// 移動e到mark之後

func (l *list) moveafter(e, mark *element)

// 移動e到mark之前

func (l *list) movebefore(e, mark *element)

// 移動e到末尾

func (l *list) movetoback(e *element)

// 移動e到開頭

func (l *list) movetofront(e *element)

注意e和mark都必須是l的內的元素,否則該函式不執行任何動作。

示例:

two := coll.pushfront(2)

before2 := coll.insertbefore("before2", two)

after2 := coll.insertafter("after2", two)

// 將before2移動到two的後面

coll.moveafter(before2, two)

// 將after2移動到two的前面

coll.movebefore(after2, two)

// 將before2移動到開頭

coll.movetofront(before2)

// 將after2移動到末尾

coll.movetoback(after2)

list匯出了back()和front()返回結尾和開頭元素:co

ntai

ner/

list

−−−−

−−−−

−−−−

// 返回結尾元素

func (l *list) back() *element

// 返回開頭元素

func (l *list) front() *element

示例:

fmt.println(coll.front().value) // 列印開頭元素的值

fmt.println(coll.back().value) // 列印結尾元素的值

element匯出了兩個方法prev()和next()用以訪問前乙個或後乙個元素:co

ntai

ner/

list

−−−−

−−−−

−−−−

// 返回下乙個元素,如果沒有下乙個元素,返回nil

func (e *element) next() *element

// 返回前乙個元素,如果沒有前乙個元素,返回nil

func (e *element) prev() *element

示例:

// 順序遍歷

for e := coll.front(); e != nil; e = e.next()

fmt.println()

// 逆序遍歷

for e := coll.back(); e != nil; e = e.prev()

fmt.println()

co

ntai

ner/

list

−−−−

−−−−

−−−−

func (l *list) len() int
示例:

fmt.println(coll.len())
co

ntai

ner/

list

−−−−

−−−−

−−−−

// 移除e,返回e的值

func (l *list) remove(e *element) inte***ce{}

// 清空列表

func (l *list) init() *list

示例:

coll := list.new()

two := coll.pushfront(2)

coll.remove(two) // 移除two

coll.init() // 清空列表

package main

import (

"container/list"

"fmt"

)func printlist(coll *list.list)

fmt.println()

}func printlistr(coll *list.list)

fmt.println()

}func main()

STL通用容器之 list 容器

list容器 相對於vector的連續線性空間,list是乙個雙向鍊錶,它有乙個重要性質 插入操作和刪除操作都不會造成原有的list迭 器失效,每次插入或刪除乙個元素,就配置或釋放乙個元素空間。也就是說,對於任何位置的元素插入或刪除,list 遠是常數時間。1 建構函式 listc 建立乙個空的li...

18 容器之list探索

本篇主要在之前的基礎上,更加深入的介紹stl中的雙向鍊錶容器list,包括list類模板 迭代器iterator等。1 容器list是雙向鍊錶的結構,如下 解析 a list是環狀的鏈式結構,在鍊錶最後有塊空白節點用於實現容器的前閉後開區間,用end 方法返回。b 鍊錶中包含迭代器node,裡面包含...

list容器之排序案例

案例描述 將per型別進行排序,per屬性中有姓名,年齡,身高,體重 排序規則 按照年齡進行公升序排列,如果年齡相同按照身高進行降序排列,如果身高相同按照體重進行公升序排列 原始碼如下 include using namespace std include include class per 有參建...