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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PyXll-Jupyter

    PyXll-JupyterPyXll-Jupyter可以将Jupyter嵌入到excel中,可以在excel中调用python函数。

    2025年8月7日
    3
  • 计算机主板电源接口8pin,菜鸟老鸟都要知道 电源接口图文全教程[通俗易懂]

    计算机主板电源接口8pin,菜鸟老鸟都要知道 电源接口图文全教程[通俗易懂]【IT168应用】电源的功率一直是玩家们关注的焦点,可对于刚涉足DIY领域的用户来说,自己组装DIY一台电脑拿才是最令人兴奋的事情。组装电脑少不了要接各种各样的线材,那么如何辨别各种类型的接口,每个接口之间的的功能有何区别呢?电源接口种类繁多伴随着硬件技术进步,电源的接口也随之发生改变,原本被成为最保值的配件也沦为淘汰边缘。好在一些高档电源的功率能够满足现在主流配置的应用需求,只是缺少几个专用接…

    2025年6月28日
    2
  • 命令行中 javac、java、javap 的使用详解

    命令行中 javac、java、javap 的使用详解进入命令窗口,若要切换到指定目录,例如E盘下的目录,有2种方法:1)pushd[路径],此命令可将当前目录设为指定的任一个已存在的目录C:\Users\Administrator>pushde:360DownloadsE:\360Downloads>dir//显示当前目录下的目录及文件2)直接先输入e:,然后再用cd切换到指定目录1.javac

    2022年5月28日
    80
  • 全源最短路径问题采用Floyd算法进行求解_floyd算法求最短路径是贪心吗

    全源最短路径问题采用Floyd算法进行求解_floyd算法求最短路径是贪心吗前言在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。在单源正权值最短路径,我们会用Dijkstra算法来求最短路径,并且算法的思想很简单—贪心算法:每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等待下一次的抛出确定。虽然思想很简单,实现起来是非常复杂的,我们需要邻接矩阵(表)储存长度,需要优先队列(或者每次都比较)维护一个预选点的集合。还要用一个boolean数组标记是否已经确定、

    2025年8月12日
    2
  • Centos7更换阿里云yum源

    Centos7更换阿里云yum源

    2021年5月31日
    116
  • PHP中用下划线开头的变量含义「建议收藏」

    PHP中用下划线开头的变量含义

    2022年2月8日
    45

发表回复

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

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