c++ map是有序还是无序的_实现有序map之go「建议收藏」

c++ map是有序还是无序的_实现有序map之go「建议收藏」GoMap介绍Go中Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。c++中的实现在C++STL中map采用红黑树实现,可以实现有序的Map.Go中实现实现原理这个实现方法的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Go Map介绍

Go 中 Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。

c++中的实现

在C++ STL 中map 采用红黑树实现,可以实现有序的Map.

Go 中实现

实现原理

这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作

实现代码

package main

import (

“container/list”

“fmt”

)

type Keyer interface {

GetKey() string

}

type MapList struct {

dataMap map[string]*list.Element

dataList *list.List

}

func NewMapList() *MapList {

return &MapList{

dataMap: make(map[string]*list.Element),

dataList: list.New(),

}

}

func (mapList *MapList) Exists(data Keyer) bool {

_, exists := mapList.dataMap[string(data.GetKey())]

return exists

}

func (mapList *MapList) Push(data Keyer) bool {

if mapList.Exists(data) {

return false

}

elem := mapList.dataList.PushBack(data)

mapList.dataMap[data.GetKey()] = elem

return true

}

func (mapList *MapList) Remove(data Keyer) {

if !mapList.Exists(data) {

return

}

mapList.dataList.Remove(mapList.dataMap[data.GetKey()])

delete(mapList.dataMap, data.GetKey())

}

func (mapList *MapList) Size() int {

return mapList.dataList.Len()

}

func (mapList *MapList) Walk(cb func(data Keyer)) {

for elem := mapList.dataList.Front(); elem != nil; elem = elem.Next() {

cb(elem.Value.(Keyer))

}

}

type Elements struct {

value string

}

func (e Elements) GetKey() string {

return e.value

}

func main() {

fmt.Println(“Starting test…”)

ml := NewMapList()

var a, b, c Keyer

a = &Elements{“Alice”}

b = &Elements{“Bob”}

c = &Elements{“Conrad”}

ml.Push(a)

ml.Push(b)

ml.Push(c)

cb := func(data Keyer) {

fmt.Println(ml.dataMap[data.GetKey()].Value.(*Elements).value)

}

fmt.Println(“Print elements in the order of pushing:”)

ml.Walk(cb)

fmt.Printf(“Size of MapList: %d \n”, ml.Size())

ml.Remove(b)

fmt.Println(“After removing b:”)

ml.Walk(cb)

fmt.Printf(“Size of MapList: %d \n”, ml.Size())

}

优点

红黑树的插入、删除、查找的复杂度都是 O(logn), 而这个实现插入查找删除的复杂度都是 O(1), 可以说是一种非常好的数据结构。

缺点

使用了两个数据结构,空间占用稍微大了一点。但是和树的实现比,这个占用也不算非常大

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190163.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php avc,什么是AVC编码?简述H.264概念和发展

    php avc,什么是AVC编码?简述H.264概念和发展频编解码技术有两套标准,国际电联(ITU-T)的标准H.261、H.263、H.263+等;还有ISO的MPEG标准Mpeg1、Mpeg2、Mpeg4等等。H.264/AVC是两大组织集合H.263+和Mpeg4的优点联合推出的最新标准,最具价值的部分无疑是更高的数据压缩比。在同等的图像质量条件下,H.264的数据压缩比能比H.263高2倍,比MPEG-4高1.5倍。以下我们简单介绍H.264的…

    2022年9月16日
    0
  • Android控件 – TextView、Button、EditText、CompoundButton、CheckBox简介「建议收藏」

    Android控件 – TextView、Button、EditText、CompoundButton、CheckBox简介「建议收藏」TextViewTextView类是View的直接子类,用于单纯地显示一行或多行静态文本的视图。它继承View所有XML属性,并有着自己的XML属性。在XM布局中常用的属性:属性说明android:autoLink设置文本超链接样式,并点击跳向链接,值:none不匹配任何类型的文字(默认);web匹配URL地址,单击后打开浏览器显示地址;email匹配邮箱地址,单击后打

    2022年7月18日
    12
  • 软件测试面试的自我介绍模板(无经验者面试软件测试)

    面试官,你好,我叫Jayce,16年本科毕业,从事软件测试将近3年的时间。在此期间做过一些项目也积累过一些经验,能够独立地完成软件测试流程的一个工作。我之前主要做过的是功能测试,web自动化测试、app专项测试、接口测试、也有用过Jmeter做过一些性能方面的测试。我对于缺陷管理工具比如禅道,版本控制器git与svn能够熟悉应用。数据库、linux、Fiddler、Jmeter这些应用也比较熟悉。…

    2022年4月15日
    53
  • 电脑鼠标能动但点什么都没反应_联想台式机鼠标键盘没反应

    电脑鼠标能动但点什么都没反应_联想台式机鼠标键盘没反应1.联想电脑鼠标盘没反应是怎么回事1.打开笔记本电脑,没有任何提示,但触摸板触摸完全没有反应。这时候要确保触摸屏不是锁上了,触摸屏锁上了就会完全没有反应,这个解决办法很简单,笔记本一般按住Fn(功能键)+F6(不同的笔记本不同的按键,按键上有触摸板图像)即可解锁。有些笔记本有独立的触摸屏开锁键,注意看看哪个键有个小键盘在上面的即可。2.软件问题主要说的是驱动出现问题,例如刚刚重新安装过电脑…

    2022年9月14日
    0
  • 奇怪的现象:touchesBegan: 与UITapGestureRecognizer手势没有人响应 以及set方法的妙用

    奇怪的现象:touchesBegan: 与UITapGestureRecognizer手势没有人响应 以及set方法的妙用本打算实现一个点击按钮弹出一个landKindView然后点击屏幕其他部分时移除这个VIew,没想到的是,出了诸多不可思议的问题。在给这个控制器的View添加手势时,然后居然拦截不到,touchesbegin方法,然后又试了下添加tapGesture,依旧是没有反应。然后我试着在touchesBegin方法中 实现[supertouchesBegins….];依旧是没有任

    2022年7月25日
    6
  • 奥迪token失效,请重新登录_请求token失效怎么解决

    奥迪token失效,请重新登录_请求token失效怎么解决出现Token失效,请重新登录重新登录下就好了啊1首先我们的先拿到token2.放上Authorize再去测试自己的接口这样就好了

    2022年9月3日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号