go的標準包container
中包含了常用的容器型別,包括conatiner/list
,container/heap
,container/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 有參建...