• 极智编程 | 谈谈 C++ 中容器 map 和 unordered_map 的区别


    欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

      大家好,我是极智视界,本文来 谈谈 C++ 中 map 和 unordered_map 的区别

      map 和 unordered_map 都可以看做是一种 key-value 的映射关系,unordered_map 可以理解为 无序版的map。unordered_map 是在 C++11 标准才出现的,所以你在代码中如果使用了 unordered_map,则在编译的时候要使用 c++11及以后的标准 进行编译。

      这里直击要点:

    • map 底层是 红黑树,(1) 增、删、改、查都是十分平稳的 log(n) 的复杂度,(2) 基于二叉查找树,数据是有序排列的 (按 key 排序)。在存储上 map 比较占用空间,因为在红黑树中,每一个节点都要额外保存父节点和子节点的连接,因此使得每一个节点都占用较大空间来维护红黑树的性质。
    • unordered_map 底层是 hash表, 其查找的复杂度是常数级别的 O(1),构造的时候如果有冲突时间成本会增加,并且做不到数据有序排列。冲突的解决:当冲突数小于8的时候用链式地址法解决冲突,当冲突大于8的时候使用红黑树解决冲突。

      来把区别用表格展示:

    mapunordered_map
    平稳的 log(n)比较快,平均 O(1),最坏的情况 O(n)
    log(n) + 平衡二叉树使用的时间同上
    log(n) + 平衡二叉树使用的时间同上
    是否排序有序无序
    底层实现红黑树哈希表
    适用场景要求排序的场景查找操作频率高的场景

      map 和 unordered_map 在代码使用上十分类似,来看看两者的用法:

    int main(){
       map 用法
      map _ismap;
      // 增的三种方法
      _ismap.insert(make_pair(0, "kobe"));
      _ismap[1] = "james";
      _ismap.insert(map::value_type(2, "curry"));
      // 遍历
      for (auto &iter : _ismap){
        cout << iter.first << " : " << iter.second << endl;
        /*
        * 输出如下 按key递增排序
        * 0 : kobe
        * 1 : james
        * 2 : curry
        */
      }
      // 删除
      map ::iterator _mapIter = _ismap.find(0);
      _ismap.erase(_mapIter);    // 删除指定的key
      // _ismap.erase(0);  // 删除key=0的键值对
      // _ismap.erase(std::begin(_ismap));   // 删除第一个键值对
      
      
       unordered_map 用法
      unordered_map _isunorderedMap;
      // 增的三种方法
      _isunorderedMap.insert(make_pair(0, "yaoming"));
      _isunorderedMap[1] = "yi";
      _isunorderedMap.insert(unordered_map::value_type(2, "zhouqi"));
      // 遍历
      for (auto iter = unorderedMap.begin(); iter != unorderedMap.end(); iter++){
        cout << iter->first << " : " << iter->second << endl;
        /*
        * 输出如下 乱序
        * 2 : zhouqi
        * 0 : yaoming
        * 1 : yi
        */
        // 删除
        auto _unorderedIter = _isunorderedMap.find(0);
        _isunorderedMap.erase(_unorderedIter);     // 删除指定的key
        // _unorderedIter.erase(0);    // 删除key=0的键值对
        // _unorderedIter(_unorderedIter.begin());    // 删除第一个键值对
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

      好了,以上分享了 谈谈 C++ 中容器 map 和 unordered_map 的区别,希望我的分享能对你的学习有一点帮助。


     【极智视界】

    《极智编程 | 谈谈 C++ 中容器 map 和 unordered_map 的区别》


    在这里插入图片描述

    搜索关注我的微信公众号【极智视界】,获取我的更多经验分享,让我们用极致+极客的心态来迎接AI !


  • 相关阅读:
    Linux-5-进程控制
    ESP8266-Arduino网络编程实例-Web页面WiFi配置管理
    MOS管和IGBT区别,一看就懂
    base64URL解析浏览器链接中的json
    Java 复习笔记 - 集合进阶篇:List集合
    隐函数求导例题
    【python】多线程、多进程性能比较
    Year 2038 problem
    Netty的InboundHandler 和OutboundHandler
    {草履虫都能看懂的} 数据结构串的PM、next和nextval数组的求法
  • 原文地址:https://blog.csdn.net/weixin_42405819/article/details/127886949