结论:

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)
}

go语言的map以及红黑树的map相关推荐

  1. 底层实现红黑树_stl map底层之红黑树插入步骤详解与代码实现 | 学步园

    本篇文章并没有详细的讲解红黑树各方面的知识,只是以图形的方式对红黑树插入节点需要进行调整的过程进行的解释. 最近在看stl源码剖析,看到map底层红黑树的实现.为了加深对于红黑树的理解就自己动手写了红 ...

  2. 学习->C++篇十五:红黑树和map,set

    目录 一 . 红黑树的定义(规则): 二 . 红黑树是如何保持平衡的? 插入操作: 情况一:叔叔节点存在且为红色 情况二:叔叔节点不存在或存在且为黑色 三.map和set如何封装? 一 . 红黑树的定 ...

  3. AVL树和红黑树(map和set的底层实现)

    map和set的概念及使用 map和set的底层结构 map和set其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时 ...

  4. 红黑树(二)之 C语言的实现

    红黑树(二)之 C语言的实现 概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识, ...

  5. 【C++】用一棵红黑树同时封装出map和set

    苦厄难夺凌云志,不死终有出头日. 文章目录 一.封装第一层:仿函数取结点中的key关键码 二.封装第二层:红黑树的普通迭代器 1.map和set的表层迭代器实现 2.底层红黑树中迭代器的实现 三.封装 ...

  6. 图解 二叉查找树 红黑树

    红黑树,对很多童鞋来说,是既熟悉又陌生.熟悉是因为在校学习期间,准备面试时,这是重点.然后经过多年的荒废,如今已经忘记的差不多了.如果正在看文章的你,马上快要毕业,面临着找工作的压力:又或者你觉得需要 ...

  7. 红黑树(一)之 原理和算法详细介绍---转帖

    目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sky W ...

  8. 红黑树(一)之 原理和算法详细介绍

    出处:http://www.cnblogs.com/skywang12345/p/3245399.html 概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树 ...

  9. 红黑树 之 原理和算法详细介绍

    概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sk ...

最新文章

  1. 设计模式详解(总纲)
  2. CentOS通过日志反查入侵(转)
  3. 应云而生,幽灵的威胁 - 云原生应用交付与运维
  4. SQL Server2005设置sa登录名
  5. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)
  6. ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置
  7. 工作234:按钮禁用
  8. 春节抽空读了8本书,只有这本书我1字不落的读完了!(上)
  9. hdu 3923 Invoker
  10. iOS 8 Metal Swift教程 :开始学习
  11. nodejs调用函数和模块
  12. SAP License:欧洲人的项目
  13. W25QXX FLASH介绍
  14. Latex希腊字母对照表
  15. Python学习笔记-2017.5.4thon学习笔记-2017.8.16
  16. class文件格式解析
  17. 国内被广泛模仿的12个国外网站
  18. getaddrinfo神秘面纱
  19. iOS 视频播放从零开始(二)
  20. 怎样用MP3转换器转换音频格式

热门文章

  1. vs.net 2005 中自定义模版项
  2. 牛客多校2 - All with Pairs(字符串哈希+next数组)
  3. 洛谷 - P1886 滑动窗口(单调队列/线段树)
  4. Keras-常用代码
  5. 两年前搭建的网狐系统
  6. PE文件结构详解(五)延迟导入表
  7. 网狐棋牌(四) TimerEngine
  8. ARP攻击实战之WinArpAttacker
  9. Linux网络编程 | 事件处理模式:Reactor模式、Proactor模式
  10. Scrapy中的get_project_settings 读取设置文件