• map和set


    序列式容器和关联式容器

    序列式容器:其底层的数据结构是线性结,例如:vector、list、deque、forward_list
    关联式容器:里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。底层是二叉搜索树。
    例如:map、set、multimap、multiset

    什么是键值对? (大致理解:就是一个类,里面两个元素)

    template <class T1, class T2>
    struct pair
    {
    typedef T1 first_type;
    typedef T2 second_type;
    T1 first;
    T2 second;
    pair(): first(T1()), second(T2())
    {}
    pair(const T1& a, const T2& b)
    : first(a), 
      second(b)
    {}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    set和multiset

    set的元素是val,但是实际上底层是的键值对,但是使用的时候只需要插入单个元素val就可以,
    不需要构造键值对。另外,set默认是升序(按小于比较),不可以重复。
    multiset和set差不多,唯一的区别就是val可以重复。
    在这里插入图片描述

    map和multimap

    map 里面存放的元素是键值对,key不能重复,默认是升序。 multimap和map的关系类似于set和multiseta
    在这里插入图片描述
    在这里插入图片描述

    operotor[]的重载
    先看这样代码的输出
    在这里插入图片描述
    我们可以清楚的看到,当map的下标是key的时候,返回值是val的引用 实际上,底层原理也正是这样。
    在这里插入图片描述
    我们可以借助这样的特点完成一些统计。
    例如:有很多的水果,统计水果出现的次数。

    在这里插入图片描述

    map<string, string> dict;
    	dict.insert(make_pair("sort", "排序")); //这个是插入,分成功和失败
    	dict["left"] = "左边";  // 插入+修改(先插入<"left","">,然后在修改val)
    	dict["insert"]; // 插入   (直接插入<"insert", "">)
    	dict["insert"] = "插入";     // 修改 
    	dict["left"] = "左边、剩余";  // 修改
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    关于map和set习题练习

    牛客网-------- KY264 单词识别
    https://www.nowcoder.com/practice/16f59b169d904f8898d70d81d4a140a0?tpId=94&tqId=31064&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fbit-kaoyan%2Fquestion-ranking&tPage=2

    在这里插入图片描述

    #include
    #include
    #include
    using namespace std;
    
    int main()
    {
      string str;
      getline(cin,str);
      map<string,int> m1;
      multimap<int,string,greater<int>> m2;//要排升序,次数会重复
      int i = 0, j = 0;
        
      //先全部转换为小写
      for(auto& e : str)
      {
       if(isupper(e))
           e = tolower(e);
      }
      
      //拿出每一个单词放入m1(排的字母顺序)
      for(i = 0; i < str.size(); i++)
      {
        if(str[i] == ' ' || str[i] == '.')
        {
           string s = str.substr(j,i-j);
           j = i + 1;
           m1[s]++; 
        }
      }
      //排的次数
      for(const auto& e : m1)
      {
        m2.insert(make_pair(e.second,e.first));
      }
      //打印
      for(const auto& e : m2)
      {
       cout << e.second <<":" << e.first <<endl;
      }
        
      return 0;
    }
    
    • 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
  • 相关阅读:
    JavaScript基础07——变量拓展-数组
    老掉牙的 synchronized 锁优化,一次给你讲清楚!
    大数据安全验证之Kerberos | StartDT Tech Lab 11
    [附源码]SSM计算机毕业设计小说网站的设计与实现1JAVA
    小团队之间有哪些好用免费的多人协同办公软件
    Flutter:Android/iOS集成Flutter模块
    信息化发展55
    等保测评有那些流程?为什么要做等保
    字段映射 mapStruct lombok
    SpringMVC小记
  • 原文地址:https://blog.csdn.net/CL2426/article/details/126659608