0
点赞
收藏
分享

微信扫一扫

C++语言基础:STL----unordered_map、unordered_multimap、unordered_set、unordered_multiset

phpworkerman 2022-05-06 阅读 69
  • 2.9、unordered_map
    • 2.9.1、unordered_map基本概念
      • 1、简介
        • 1. unordered_map是无序 map 容器C++11标准,底层是哈希表存储结构;解决冲突:链地址法
        • 2. pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
        • 3. 所有元素都根据元素的键值无序排序
      • 2、本质:map与unordered_map的区别
        • 1). map是关联式容器,unordered_map是无序容器
        • 2). 关联式容器的底层实现采用的树存储结构,更确切的说是红黑树结构;
        • 3). 无序容器的底层实现采用的是哈希表的存储结构。
        • 4). 总的来说,实际场景中如果涉及大量遍历容器的操作,建议首选关联式容器;反之,如果更多的操作是通过键获取对应的值,则应首选无序容器。
      • 3、优点:和关联式容器相比,无序容器具有以下 2 个特点
        • 1). 无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键
        • 2). 和关联式容器相比,无序容器擅长通过指定键查找对应的值(平均时间复杂度为 O(1));但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器。
      • 4、无序容器种类
        • (1) unordered_map
          • 存储键值对 <key, value> 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。
        • (2) unordered_multimap
          • 和 unordered_map 唯一的区别在于,该容器允许存储多个键相同的键值对。
        • (3) unordered_set
          • 不再以键值对的形式存储数据,而是直接存储数据元素本身(当然也可以理解为,该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。另外,该容器存储的元素不能重复,且容器内部存储的元素也是无序的。
        • (4) unordered_multiset
          • 和 unordered_set 唯一的区别在于,该容器允许存储值相同的元素
    • 2.9.2、map构造函数
      • 1、函数原型
        • 1. unordered_map<T1, T2> umap; // 1.默认构造形式
        • 2. unordered_map(const unordered_map& umap); //2. 拷贝构造函数
        • 3. unordered_map<string, string> umap2(retUmap()); //3. 移动构造函数
        • 4. unordered_map<string, string> umap2(++umap.begin(),umap.end()); // 4. 使用 unordered_map 类模板提供的迭代器,在现有 unordered_map 容器中选择部分区域内的键值对,为新建 unordered_map 容器初始化。创建的 umap2 容器,其内部就包含 umap 容器中除第 1 个键值对外的所有其它键值对。
      • 2、示例

        • unordered_map<string, string> umap; // 1.默认构造形式
          unordered_map<string, string> umap2(umap); //2. 拷贝构造函数
          // 3. 移动构造函数
          //1)返回临时 unordered_map 容器的函数
          unordered_map <string, string > retUmap(){
          unordered_map<string, string>tempUmap{
          {"Python教程","Python基础教程,Python入门教程(非常详细)"},
          {"Java教程","Java学习教程,Java基础教程(从入门到精通)"},
          {"Linux教程","Linux命令大全,Linux常用命令【非常详细】"} };
          return tempUmap;
          }
          //2)调用移动构造函数,创建 umap2 容器
          unordered_map <string, string > umap2(retUmap());
          unordered_map<string, string> umap2(++umap.begin(),umap.end()); // 4. 创建的 umap2 容器,其内部就包含 umap 容器中除第 1 个键值对外的所有其它键值对。

    • 2.9.3、map赋值和交换操作
      • 1、函数原型
        • 1. unordered_map& operator=(const unordered_map& mp); // 1.重载等号操作符
        • 2. swap(mp); // 2. 交换两个集合容器, 交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。
    • 2.9.4、unordered_map判空和大小
      • 1、函数原型
        • 1. empty(); // 判断容器是否为空
        • 2. size(); // 返回容器中元素的个数
    • 2.9.5、unordered_map插入和删除
      • 1、函数原型
        • 1. insert(ele); //插入元素ele,无返回值
        • 1. emplace(ele); //插入元素ele,无返回值,向容器中添加新键值对,效率比 insert() 方法高。
        • 2. clear(); // 删除容器中所有的元素
        • 3. erase(const_iterator pos); // 删除pos位置的元素,返回下一个元素的位置
        • 4. erase(const_iterator start, const_iterator end); // 删除迭代器从[start,end)之间的元素,返回下一个元素的位置
        • 5. erase(key); // 删除容器中值为key的元素
    • 2.9.6、unordered_map查找和统计
      • 函数原型
        • 1. find(key); // 查找key是否存在,返回该键的元素的迭代器;若不存在,则返回unordered_map.end();
        • 2. count(key); // 统计key的元素的个数
    • 2.9.7、map容器无序
      • 1、学习目标
        • unordered_map容器默认排序规则为无序的,掌握如何改变规则
      • 2、技术点
        • 利用仿函数,可以改变排序规则
举报

相关推荐

0 条评论