zoukankan      html  css  js  c++  java
  • C++标准库分析总结(六)——<Map、Multimap、Set、Multiset设计原则>

      关联容器我们可以看做是一个小型的数据库,它就是用key找value,编译器底层对于关联容器的实现有两种:红黑树(Red-Block tree)和哈希表(hash table,散列表)。

    一、红黑树简单介绍

      红黑树是高度平衡二叉树,左子树和右子树都是保持高度平衡的,不会出现某一个分支太长,并提供有迭代器,便利迭代器时红黑树是排好序的,,也就是说我们用红黑树做map和set的底层结构能够很方便的查找。

      注意:红黑树的元素值我们一般是不去改变(通过迭代器)的,因为元素是有序的,但是没有说不可以,因为元素是由key和data两部分合起来(合起来统称为value)组成的,而我们仅仅只能改变data部分,而key是不能变得。

    二、Set、Multiset

    2.1 基本介绍

      注意:因为set使用红黑树做底部结构,但是set只有一个元素(key和data是一样得,也就是说key就是value),所以set是不允许改变元素值得,所以在实现上,set的迭代器拿到的是const的iterator,是不能修改的。

    2.2 内部结构介绍

      因为set本身不干活,他只是相当于一个中介作用,把事交给红黑树才做,所以又称为一种容器适配器

    2.3 使用示例

    三、Map、Multimap

    3.1 基本介绍

      注意:因为map使用红黑树做底部结构,map的元素由key和data两部分组成(称为value),用户使用时指定的key和data被内部封装成了pair,而key拿到的是const iterator不允许用户改变,data部分是可以通过迭代器改变的。

     

    3.2 内部结构介绍

    3.3 使用示例

    3.4 map和multimap区别点

      multimap不可以使用下表操作符[],而map可以使用,中括号操作符作用:如果map中有这个key,则返回这个key关联的data,如果不存在则会在适当位置创建这样一个pair(key,默认值的data),中括号操作符如下:

    3.5 中括号[]和insert哪个效率高

      insert效率高于中括号,因为中括号其实是先进行了lower_bound(二分搜寻)之后,再调用insert插入元素。

    作者:灼光
    本博客文章大多为原创,转载请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    微信公众号开发第一版
    关于AJAX
    Node——异步I/O机制
    boostrap框架学习
    less学习笔记
    this指向
    关于js作用域
    mybatis映射mapper文件的#{}和${}的区别和理解
    Eclipse国内镜像源配置
    eclipse优化加速提速,解决eclipse卡、慢的问题
  • 原文地址:https://www.cnblogs.com/laiyingpeng/p/11225983.html
Copyright © 2011-2022 走看看