• C++:关联式容器map的使用


    目录

    1、map的简介

     2、map的初始化 

     2.1、方法1 

    2.2、方法2 

    2.3、方法3

    3、map的排序的比较(仿函数)

    4、 map的常用内置函数使用 

    4.1迭代器

    4.2容量

     4.3元素访问

     3.4修改器

     3.5操作

    5、map的遍历(迭代)

    5.1迭代器 

    5.2范围for 

    总结


    1、map的简介

    • map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
    • 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair: typedef pair value_type;
    • 在内部,map中的元素总是按照键值key进行比较排序的
    • map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
    • map支持下标访问符,即在[ ]中放入key,就可以找到与key对应的value。
    • map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

    • key: 键值对中key的类型
    • T: 键值对中value的类型
    • Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
    • Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器

     2、map的初始化 

     2.1、方法1 

    	map<int, int> m;  //构造一个空的

    2.2、方法2 

    1. map<char, int> m;
    2. m['a'] = 10;
    3. m['b'] = 30;
    4. m['c'] = 50;
    5. m['d'] = 70;
    6. map<char, int> m1(m); //拷贝构造

    2.3、方法3

    1. map<char, int> m;
    2. m['a'] = 10;
    3. m['b'] = 30;
    4. m['c'] = 50;
    5. m['d'] = 70;
    6. map<char, int> m2(m.begin(), m.end()); //迭代器构造

    3、map的排序的比较(仿函数)

    1. struct classcomp
    2. {
    3. bool operator() (const char& lhs, const char& rhs) const
    4. {
    5. return lhs > rhs;
    6. }
    7. };
    8. map<char, int, classcomp> m3; // class as Compare

    4、 map的常用内置函数使用 

    4.1迭代器

    1. map<int,int> v;
    2. //Iterators(迭代器)
    3. v.begin(); //获取第一个数的位置
    4. v.end(); //获取最后一个数的位置
    5. v.rbegin(); //获取最后一个数的位置
    6. v.rend(); //获取第一个数的位置

    4.2容量

    1. map<int,int> v;
    2. //Capacity(容量)
    3. v.size(); //获取v数据的个数
    4. v.max_size(); //返回字符串可以达到的最大长度
    5. v.empty(); //判断v是否为空

     4.3元素访问

    1. map<char, int> m;
    2. m['a'] = 10; //和数组下标类似,但是是以key找出value
    3. cout << m['a'] <<endl;
    4. /*operator[]的原理是:
    5.   用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中
    6.   如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器
    7.   如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器
    8.   operator[]函数最后将insert返回值键值对中的value返回*/

     3.4修改器

    1. map<char, int> m;
    2. map<char, int> m1;
    3. m['a'] = 10;
    4. m['b'] = 30;
    5. m['c'] = 50;
    6. m['d'] = 70;
    7. m.insert(make_pair('e', 88)); //插入元素
    8. map<char, int>::iterator it = m.find('b');
    9. m.erase(it); // erasing by iterator
    10. m.erase('c'); // erasing by key
    11. it = m.find('d');
    12. m.erase(it, m.end()); // erasing by range
    13. m1.swap(m); //交换
    14. m1.clear(); // 清空

     3.5操作

    1. map<char, int>::iterator it = m.find('b');
    2. m.count('a');

    5、map的遍历(迭代)

    5.1迭代器 

    1. map<char, int>::iterator it = m.begin();
    2. while (it != m.end())
    3. {
    4. cout << (*it).first << " " << (*it).second << endl;
    5. it++;
    6. }

    5.2范围for 

    1. for (auto e : m)
    2. {
    3. cout << e.first << " " << e.second << endl;
    4. }

    总结

    1. map中的的元素是键值对
    2. map中的key是唯一的,并且不能修改
    3. 默认按照小于的方式对key进行比较
    4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列
    5. map的底层为平衡搜索树(红黑树),查找效率比较高O(log2  N)
    6. 支持[ ]操作符,operator[ ]中实际进行插入查找
  • 相关阅读:
    vue3.0 + qiankun遇到的问题
    【window 安装多环境python冲突 -已解决】
    UE4 C++ ActionRoguelike开发记录
    Security ❀ CSP Bypass 内容安全策略绕过
    大学生求职企业招聘APP(服务端采用jsp+mysql,手机端采用android开发)
    HTX 与 Zebec Protocol 展开深度合作,并将以质押者的身份参与 ZBC Staking
    ACL 2019 - AMR Parsing as Sequence-to-Graph Transduction
    IOS浏览器不支持对element ui table的宽度设置百分比
    告别空指针让代码变优雅,Optional使用图文例子源码解读
    1、VS2019配置glfw和glad
  • 原文地址:https://blog.csdn.net/weixin_74268082/article/details/134325038