日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go语言的map以及红黑树的map

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go语言的map以及红黑树的map 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結論:

1. go語言自帶的map是基于hash表實現的

2. c++語言中map是基于紅黑樹實現的

3. go語言很多第三方庫中提供了基于紅黑樹map的實現

?

這里我們推薦的是由Social Explorer團隊開源的gods框架,簡稱"上帝",其實是GoDS(Go Data Structures),是數據結構與算法相關的框架

官網:https://www.socialexplorer.com/

GitHub?https://github.com/emirpasic/gods

使用如下圖:

示例代碼如下(有很詳細的注釋,基本上C++中map有的,這里都有對應的方法):

package mainimport ("fmt"rbt "github.com/emirpasic/gods/trees/redblacktree"utils "github.com/emirpasic/gods/utils" )// 玩家結構體的定義 type player struct {playerID uint64 // 玩家IDscore int64 // 分數nation int32 // 國家ID }// 新建一個玩家 func newPlayer(playerID uint64, score int64, nation int32) *player {return &player{playerID: playerID,score: score,nation: nation,} }// 遍歷打印已一個map func printMap(t *rbt.Tree) {iter := t.Iterator()for iter.Next() {pPlayer := iter.Value().(*player)fmt.Printf("key:%v, value:%v\n", iter.Key().(uint64), pPlayer)} }func main() {// 四個玩家player1 := newPlayer(1, 1, 1)player2 := newPlayer(2, 2, 2)player3 := newPlayer(3, 3, 3)player4 := newPlayer(4, 4, 4)// 新建紅黑樹(自帶比較函數,庫中帶了幾乎所有的基礎類型,如果還是不夠,可以自定義)allPlayers := rbt.NewWith(utils.UInt64Comparator)// 插入allPlayers.Put(player1.playerID, player1)allPlayers.Put(player2.playerID, player2)allPlayers.Put(player3.playerID, player3)// 重復插入key(下面會發現會覆蓋)allPlayers.Put(player3.playerID, player4)// 遍歷fmt.Println("插入后遍歷")printMap(allPlayers)// 獲取存在的keypValue, exist := allPlayers.Get(uint64(1))if exist {pPlayer := pValue.(*player)fmt.Printf("\n獲取存在的key:1 的玩家信息:%v \n", pPlayer)}// 獲取不存在的keypValue, exist = allPlayers.Get(uint64(111))if !exist {fmt.Printf("獲取不存在的key:111 的玩家信息:%v \n", pValue)}// 查找最后一個比5小的迭代器信息(包括5)pNode, exist := allPlayers.Floor(uint64(5))if exist {pPlayer := pNode.Value.(*player)fmt.Printf("查找最后一個比key:5小(包括5)的迭代器信息:%v \n", pPlayer)}// 查找首個比2大的迭代器信息(包括2)pNode, exist = allPlayers.Ceiling(uint64(2))if exist {pPlayer := pNode.Value.(*player)fmt.Printf("查找首個比key:2大的迭代器信息:%v \n", pPlayer)}// 刪除allPlayers.Remove(uint64(123)) // 刪除不存在的keyallPlayers.Remove(uint64(2)) // 刪除存在的key// 刪除后再次遍歷fmt.Println("\n刪除后遍歷")printMap(allPlayers) }

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的go语言的map以及红黑树的map的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。