1、map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。

2、map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。

3、map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。

4、map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。

5、multimap与map的区别:map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。

  • #include <map>

map的插入与迭代器

  • map.insert(...);                                            //往容器插入元素,返回pair<iterator,bool>
  • 在map中插入元素的四种方式:
    • 通过pair的方式插入对象                     map.insert(  pair<int,string>(3,"小张")  );
    • 通过make_pair的方式插入对象          map.insert(make_pair(0, “小王”));
    • 通过value_type的方式插入对象          map.insert(  map<int,string>::value_type(1,"小李")  );
    • 通过数组的方式插入值                       map[2] = “小龙"; mapStu[4] = “小陈";

前三种插入方式都采用了insert()方法,返回值为pair<iterator,bool>,第四种方法虽然非常方便简单,但存在性能问题,(先查找,如果没找到key = 2,会将只为初始化的队组插到map中,然后再去修改value值,如果存在key = 2时,直接修改对应的value)

map对象的拷贝构造与赋值

  • map(const map &mp);                           //拷贝构造函数
  • map& operator=(const map &mp);        //重载等号操作符
  • map.swap(mp);                                     //交换两个集合容器

map的大小

  • map.size();              //返回容器中元素的数目
  • map.empty();           //判断容器是否为空

map的删除

  • map.clear();                        //删除所有元素
  • map.erase(pos);                 //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • map.erase(beg,end);          //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • map.erase(keyElem);         //删除容器中key为keyElem的对组。

map的查找

  • map.find(key);                               //查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
  • map.count(keyElem);                    //返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
  • map.lower_bound(keyElem);        //返回第一个key>=keyElem元素的迭代器。
  • map.upper_bound(keyElem);       //返回第一个key>keyElem元素的迭代器。
  • map.equal_range(keyElem);        //返回容器中key与keyElem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。

以上函数返回两个迭代器,而这两个迭代器被封装在pair中。

//基本用法
void Fun1()
{cout << "数据是顺序排列的" << endl;map<int, string> m1;m1.insert(pair<int, string>(4, "小张"));m1.insert(make_pair( 2,"小王"));m1.insert(map<int, string>::value_type(0,"小吴"));m1[3] ="小陈";m1[1] = "小冯";for (map<int, string>::iterator it = m1.begin(); it != m1.end(); it++){pair<int, string> pr = *it;int id = pr.first;string name = pr.second;cout << "ID:" << id << " 称呼:" << name << endl;}cout << endl;//插入异常处理pair<map<int, string>::iterator, bool> pairResult = m1.insert(pair<int, string>(5, "小强"));if (!pairResult.second){cout << "插入不成功" << endl;}else{cout << "插入成功" << endl;int firstId = pairResult.first->first;string firstName = pairResult.first->second;cout << "ID:" << firstId << " Name" << firstName << endl;}cout << endl;for (map<int, string>::iterator it = m1.begin(); it != m1.end(); it++){pair<int, string> pr = *it;int id = pr.first;string name = pr.second;cout << "ID:" << id << " 称呼:" << name << endl;}cout << endl;cout << "查找" << endl;map<int, string>::iterator it1 = m1.find(10);if (it1 == m1.end()){cout << "key 10的值不存在" << endl;}else{cout << it1->first << " " << it1->second << endl;}cout << endl;cout << "equal_range查找" << endl;//m1.equal_range(3);//using _Pairii = pair<iterator, iterator>;pair<map<int, string>::iterator, map<int, string>::iterator> pairResult1 = m1.equal_range(3);//第一个迭代器 >= 3的 位置 //第一个迭代器 = 3的 位置if (pairResult1.first == m1.end()){cout << "第一个迭代器 >= 3的 位置 不存在" << endl;}else{cout << pairResult1.first->first << " " << pairResult1.first->second << endl;}if (pairResult1.second == m1.end()){cout << "第二个迭代器 > 3的 位置 不存在" << endl;}else{cout << pairResult1.second->first << " " << pairResult1.second->second << endl;}cout << endl;cout << "删除" << endl;cout << "删除之前的大小:" << m1.size() << endl;//删除while (!m1.empty()){map<int, string>::iterator it = m1.begin();cout <<"删除输出:" <<it->first << " " << it->second << endl;m1.erase(it);}cout << "删除之后的大小:" << m1.size() << endl;
}

Map和multimap的区别案例

/*
Multimap 案例:
1个key值可以对应多个value =>分组
公司有销售部 sale (员工2名)、技术研发部 development (1人)、财务部 Financial (2人)
人员信息有:姓名,年龄,电话、工资等组成
通过 multimap进行 信息的插入、保存、显示
分部门显示员工信息
*/class Person
{
public:Person(){this->m_name = "";this->m_age = 0;this->m_tle = "";this->m_salary = 0;}Person(string name,int age,char *tle,int salary){this->m_name = name;this->m_age = age;this->m_tle = tle;this->m_salary = salary;}public:string  m_name;int      m_age;string    m_tle;double    m_salary;
};void Fun2()
{Person p1, p2, p3, p4, p5;p1.m_name = "小张";p1.m_age = 22;p2.m_name = "小王";p2.m_age = 25;p3.m_name = "小吴";p3.m_age = 32;p4.m_name = "小尹";p4.m_age = 27;p5.m_name = "小陈";p5.m_age = 23;multimap<string, Person> m1;//sale部门m1.insert(make_pair("sale", p1));m1.insert(make_pair("sale", p2));//development 部门m1.insert(make_pair("development", p3));//Financial 部门m1.insert(make_pair("Financial", p4));m1.insert(make_pair("Financial", p5));for (multimap<string,Person>::iterator it = m1.begin();it != m1.end();it++){cout << it->first << ": " << it->second.m_name << " " << it->second.m_age << endl;}cout << endl;//各部门人数int num = m1.count("sale");cout << "sale部门人数:" << num << endl;int num1 = m1.count("development");cout << "development部门人数:" << num1 << endl;int num2 = m1.count("Financial");cout << "Financial部门人数:" << num2 << endl;cout << endl;//仅输出一个部门的成员信息multimap<string,Person>::iterator it = m1.find("Financial");int index = 0;while (it != m1.end() && index <num2){cout << it->first << ": " << it->second.m_name << " " << it->second.m_age << endl;it++;index++;}cout << endl;//修改成员信息for (multimap<string,Person>::iterator it = m1.begin();it != m1.end();it++){if (it->second.m_age == 25){it->second.m_name = "小七";}}for (multimap<string, Person>::iterator it = m1.begin(); it != m1.end(); it++){cout << it->first << ": " << it->second.m_name << " " << it->second.m_age << endl;}cout << endl;
}

Map和multimap容器相关推荐

  1. STL学习系列九:Map和multimap容器

    1.map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...

  2. STL之map和multimap容器

    1.简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺序排列.元素插入过程是按排 ...

  3. C++ map容器和multimap容器(STL map容器)

    目录 1. 关联容器和map容器概述 2. map容器 2.1 map的创建以及初始化列表 2.2 map容器的一般常用属性(方法) 2.3 插入数据 2.4 数据的访问和遍历 2.5 数据的删除 2 ...

  4. C++STL的map/ multimap容器

    3.9.1 map基本概念 简介: map中所有元素都是pair pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值) 所有元素都会根据元素的键值自动排序 本质: map ...

  5. c++STL容器的Map和multimap

    STL容器的Map和multimap map/multimap的简介 map/multimap对象的默认构造 map的插入与迭代器 迭代器遍历 map对象的拷贝构造与赋值 map的大小 map的删除 ...

  6. 关联式容器(map,set,multimap,multiset)

    关联式概念 STL中的部分容器,比如:vector.list.deque.forward_list(C++11)等,这 些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身. ...

  7. C++语言基础 —— STL —— 容器与迭代器 —— map 与 multimap

    [概述] map 和 multimap 是映射数据容器,两者均定义与 <map> 头文件中,其所有元素都是 pair,pair 的第一个元素被视为键值,第二个元素为实值. 他们是基于某一类 ...

  8. C++ 关联容器set | map | multiset | multimap

    前情提要 根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构.树型结构的关联式容器主要有四种:map.set.multimap.multiset.这四种容器的共同点是:使 ...

  9. map/multimap容器

    简介: map中所有元素都是pair pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值) 所有元素都会根据元素的键值自动排序 本质: map/multimap属于关联式 ...

最新文章

  1. AjaxPro组件的应用(实现Ajax)
  2. 天津12月计算机二级报名入口,2019年12月天津计算机二级考试报名入口已开通
  3. 将数据导入到mysql_06955.10.2如何将CM的外部PostgreSQL数据库迁移至MySQL服务
  4. RecSys 2017总结
  5. 乐鑫代理-启明云端分享|乐鑫ESP8266模组ESP-WROOM-02D和ESP-WROOM-02U有什么不同
  6. 【java学习】Arraylist和LinkedList使用场景与性能对比
  7. 基于Wemos的智能感应开盖垃圾桶——日记
  8. python代码命令行tab补齐_Python语言交互模式下命令tab补全
  9. (分治)7617:输出前k大的数
  10. Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用
  11. 滑动门技术的详细分析
  12. 三维重建-摄像机模型+摄像机标定(上)
  13. MySQL 基础 常用 语句(增删改查)
  14. 蓝牙耳机连接macbook无声音
  15. 阿里云部署网站全流程(基于nodejs)
  16. 宏基品牌机 win7 系统激活
  17. 016-打印菱形-【c语言版】
  18. 文件指纹修改工具 Hash Modifier
  19. 多年锤炼,迈向Kata 3.0 !走进开箱即用的安全容器体验之旅| 龙蜥技术
  20. StringBuffer是安全的吗?

热门文章

  1. 氢os 7android 5次 n,一加7 Pro推送氢OS 9.5.7.GM21更新:新增侧滑返回手势
  2. 扬州大学学子两年在网上植了349棵树
  3. 寒春:2013年2月的RSA Conference与硅谷
  4. iPhone 10.X 越狱后,抹除设备导致Cydia所有源无法安装使用彻底解决方案及遇到的问题
  5. 教你做代理,你必须掌握的4种游戏代理平台推广小妙招
  6. 测试一下新浪微博微博秀
  7. CF283E Cow Tennis Tournament
  8. matlab指令记录
  9. [力扣题解] 174. 地下城游戏 DP
  10. pdf在线压缩免费网站?