C++ STL容器 —— map/multimap 用法详解

写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理。但别人的博客终究是别人的, 最好自己上手操作一下.
写的不好, 请大神手下留情.

下面说的 “运行之后” 表示: 运行上个语句之后的结果.
一行如果说的太长的话, 就得拖动下面的进度条才能看到后面的内容, 非常麻烦
因此将一段话分成了多行, 就像现在这种形式

目录

  • C++ STL容器 —— map/multimap 用法详解
    • 简介
    • 构造函数
    • 访问 / 赋值
      • 迭代器
      • 下标 / at
      • swap (交换函数)
    • 常用函数
    • 长度 / 空间 / 容量相关函数
    • 添加元素
      • insert (插入函数)
      • emplace系列 (插入函数)
    • 删除元素
      • erase (删除函数)
    • 更改数据
    • 查找数据

简介

头文件: # include < map >
容器的每个元素类型为 pair, 将 pair 的第一部分作为 键(key), 第二部分作为 值(value), key 具有容器set的特点: 有序性, 每个 key 都有一个 value 对应, 而 value没有什么限制
会根据特定的排序标准,自动将元素进行排序。容器内的元素一直是有序的. 默认使用升序排序.
map和multimap的区别
map: 容器中 key 只能存在一个, 支持随机访问
multimap: 容器 key 可以存在多个, 不支持随机访问
其他用法都相同.

点击前往: pair 用法详解
点击前往: set/multiset 用法详解

构造函数

map <int, string> m, m1;
//定义 [int,string] 类型的map容器multimap <int, string> mm, mm1;
//定义 [int,string] 类型的multimap容器map <char, int> mchi;
//定义 [char,int] 类型的容器map <string, int> mstri;
//定义 [string,int] 类型的容器map <int, string> m3{ {1,"aaa"}, {2,"bbb"},{3,"ccc"} };
//赋值map <int, string> m4 = { {1,"aaa"}, {2,"bbb"},{3,"ccc"} };
//同上map <int, string> m5(m);
//定义新容器, 拷贝 m 所有的元素map <int, string> m6(m.begin(), m.end());
//定义新容器, 拷贝 m 区间内所有的元素map <int, string, greater<int> > m7;
//排序准则为降序map <int, string, op > m8;
//排序准则为 op

访问 / 赋值

迭代器

分为:begin、end、rbegin、rend、cbegin、cend、crbegin、crend
使用方法:

auto it=m.begin(); //相当于指针,用 *it 访问

m.begin(); 返回迭代器, 指向第一元素
m.end(); 返回迭代器, 指向最末元素的下一个位置
m.cbegin(); 返回迭代器, 指向第一元素, 类型为const
m.rbegin(); 返回反向迭代器, 指向反向迭代的第一元素
m.rend(); 返回反向迭代器, 指向反向迭代的最末元素的下一个位置
m.crbegin(); 返回反向迭代器, 指向反向迭代的第一元素, 类型为const

例: 使用正向遍历 m 数组

map <int, int> m{ {1,11},{2,22},{3,33} };
for (auto it = m.begin(); it != m.end(); it++) {//注意这里是不等于end, 而不是小于endcout << it->first << ' ' << it->second << endl;
}输出结果为:
1 11
2 22
3 33

例: 反向遍历 m 数组

map <int, int> m{ {1,11},{2,22},{3,33} };
for (auto it = m.rbegin(); it != m.rend(); it++) {//注意这里还是it++, 而不是it--cout << it->first << ' ' << it->second << endl;
}
输出结果为:
3 33
2 22
1 11

begin和rbegin的区别
m.begin()返回迭代器,指向容器内的第一元素
m.rbegin()返回逆序迭代器,指向容器内的最后一个元素

begin和cbegin的区别
可以通过m.begin()修改容器内元素的值
不能通过m.cbegin()修改容器内元素的值

下标 / at

可以使用下标 [] 和 at 函数随机访问, 并不一定是数字, 这种方式只适合map
例: m = { {1,“aaa”}, {2,“bbb”},{3,“ccc”} };
则: m[2]=m.at(2)=”bbb”
例: mstri = { { “aaa”,1 }, { “bbb”,a }, { “ccc”,3 } };
则: mstri[“bbb”]=mstri.at(“bbb”)=2;

swap (交换函数)

m.swap(m1);
//交换两个容器的内容
//例:m={ {1,11},{2,22} }, m1={ {3,33},{4,44} }
//运行之后, m={ {3,33},{4,44} }, m1={ {1,11},{2,22} }

常用函数

m.clear();
//清空容器m.empty();
//容器为空返回 true, 否则返回 false

长度 / 空间 / 容量相关函数

m.size();
//返回容器目前的元素个数
//例:m={ {1,11},{2,22} }
//返回 2m.max_size();
//返回元素个数 size 的最大值

添加元素

insert (插入函数)

m.insert({ 4,"ddd" });
//插入元素 {4,"ddd"}, map: 如果重复, 此语句不执行
//例:m={ {1,"aa"},{2,"bb"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//例:m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }m.insert(m.begin(), { 4,"ddd" });
//在位置之后插入元素 {4,"ddd"}, 用的不多, 指定位置之后还要排序
//例:m={ {1,"aa"},{2,"bb"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//例:m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }m.insert(m1.begin(), m1.end());
//插入 m1 区间所有的元素
//例:m={ {1,11},{2,22} }, m1={ {3,33},{4,44} }
//运行之后, m={ {1,11},{2,22},{3,33},{4,44} }
//例:m={ {1,11},{2,22},{3,33} }, m1={ {3,33},{4,44} }
//运行之后, m={ {1,11},{2,22},{3,33},{4,44} }

emplace系列 (插入函数)

m.emplace(pair <int, string> {4, "ddd"});
//插入元素 {4,"ddd"}
//例:m={ {1,"aa"},{2,"bb"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//例:m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }m.emplace_hint(m.begin(), pair <int, string>{4, "ddd"});
//在位置之后插入元素 {4,"ddd"}, 用的不多, 指定位置之后还要排序
//例:m={ {1,"aa"},{2,"bb"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//例:m={ {1,"aa"},{2,"bb"},{4,"ddd"} }
//执行之后: m={ {1,"aa"},{2,"bb"},{4,"ddd"} }

删除元素

erase (删除函数)

m.erase(3);//删除 key 为 3 的元素
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"} }
//执行之后: m={ {1,"aa"},{2,"bb"} }
//例:m={ {1,"aa"},{2,"bb"} }
//执行之后: m={ {1,"aa"},{2,"bb"} }m.erase(m.begin());//删除指向的元素
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"} }
//执行之后: m={ {2,"bb"},{3,"cc"} }m.erase(m.begin(), m.end());//删除区间内所有的元素
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"} }
//执行之后: m={}

更改数据

可以使用 key 随机访问并更改 value
例: m[“aaa”]=3; 或者 m.at(“aaa”)=3;

查找数据

容器内部元素有序, 因此查找时采用二分.

m.count(3);//返回 key 为 3 的元素个数
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"} }
//返回 1
//例:m={ {1,"aa"},{2,"bb"} }
//返回 0m.find(3);
//返回迭代器, 指向 key 值为 3 的第一个元素, 如果没有就返回 end()
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"} }
//返回指向{3,"cc"}的迭代器
//例:m={ {1,"aa"},{2,"bb"} }
//返回end()
//例:mm={ {1,"aa"},{2,"bb"},{3,"cc"},{3,"cc"} }
//返回指向第一个{3,"cc"}的迭代器m.lower_bound(3);
//返回迭代器, 指向 key 值>=3 的第一个元素的位置
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"},{4,"dd"} }
//返回指向{3,"cc"}的迭代器
//例:m={ {1,"aa"},{2,"bb"},{4,"dd"} }
//返回指向{4,"dd"}的迭代器
//例:mm={ {1,"aa"},{2,"bb"},{3,"cc"},{3,"cc"},{4,"dd"} }
//返回指向第一个{3,"cc"}的迭代器m.upper_bound(3);
//返回迭代器, 指向 key 值>3 的第一个元素的位置
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"},{4,"dd"} }
//返回指向{4,"dd"}的迭代器
//例:m={ {1,"aa"},{2,"bb"},{4,"dd"} }
//返回指向{4,"dd"}的迭代器
//例:mm={ {1,"aa"},{2,"bb"},{3,"cc"},{3,"cc"},{4,"dd"} }
//返回指向{4,"dd"}的迭代器m.equal_range(3);
//返回 pair 容器: [m.lower_bound(3), m.upper_bound(3)]
//例:m={ {1,"aa"},{2,"bb"},{3,"cc"},{4,"dd"} }
//返回pair{指向{3,"cc"}的迭代器, 指向{4,"dd"}的迭代器}

C++ STL容器 —— map/multimap 用法详解相关推荐

  1. STL 中map的用法详解

    STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...

  2. map/multimap用法详解

    multimap 类 标准模板库多重映射类用于存储和检索集合中的数据,此集合中的每个元素均为包含数据值和排序键的元素对. 键值不需要唯一,用于自动排序数据. 可以直接更改多重映射中的元素值,但不能直接 ...

  3. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  4. 【c++】22. STL容器的底层实现详解

    文章目录 顺序容器 vector(向量容器) deque(双端队列) list 关联容器 set(集合) multiset map(key,value) multimap 顺序容器 vector(向量 ...

  5. map函数作用c语言,C语言 · C++中map的用法详解

    转载自:http://blog.csdn.net/sunquana/article/details/12576729 一.定义 (1) mapMap; (2) 或者是:typedef   mapMym ...

  6. C++中map的用法详解

    转载自:http://blog.csdn.net/sunquana/article/details/12576729 一.定义   (1) map<string,   int>   Map ...

  7. auto与迭代器的用法_C++ STL move_iterator移动迭代器用法详解

    C++ 11 还为 STL 标准库增添了一种迭代器适配器,即本节要讲的 move_iterator 移动迭代器适配器. move_iterator 迭代器适配器,又可简称为移动迭代器,其可以实现以移动 ...

  8. [转载]Python:map函数用法详解

    一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉.若换成map来实现,则会好很多. 常规方法 map函数 1.map函数介绍及其简单使 ...

  9. python中map用法详解_Python:map函数用法详解

    一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉.若换成map来实现,则会好很多. 常规方法 map函数 1.map函数介绍及其简单使 ...

最新文章

  1. 兴趣部落的 Git 迁移实践
  2. E2. 比昨天更多的棒棒糖 (Hard)
  3. ptrace 系统调用
  4. php pdo连接oracle乱码,php pdo oracle中文乱码的快速解决方法
  5. 今天就唠叨唠叨吧……
  6. AC日记——3的幂的和 51nod 1013
  7. reading notes -- Amazon.com Recommendations: Item-to-Item Collaborative Filtering
  8. cad求和插件_黑科技 | 无BIM建模下平面CAD自动生成门窗表
  9. stack java实现_java实现stack
  10. centos 安装openoffice (办公软件 WPS)
  11. (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)
  12. Elasticsearch-PHP requires cURL, or a custom HTTP handler.
  13. 安装 Windows 自动化 API 3.0 时,visual Studio 2010 更快地运行
  14. solr6.6初探之主从同步
  15. parafac 分解_基于PARAFAC分解的大规模MU-MIMO稀疏信道估计
  16. HDU2027 统计元音【入门】
  17. 倒排索引Inverted index
  18. Jmeter安装步骤
  19. Real Estate Photography: Exterior at Twilight 房地产摄影:暮光之城 Lynda课程中文字幕
  20. Matlab imshow, image, imagesc 三者详细分析

热门文章

  1. tableau:弧线图
  2. vm虚拟机怎么安装Win11系统?Win11系统安装到vm虚拟机详细图文教程
  3. 从零开发一款相机APP 第七篇: Camera2相机 预览功能实现
  4. 第1节:英语中的名词,冠词和数词,代词
  5. OpenGL 光源分类 行为理论及实现
  6. 《Web安全测试》读书笔记
  7. Java获取当天、当前月、当前年(今年)的开始和结束时间戳
  8. java项目1DVD管理器
  9. 图之强连通、强连通图、强连通分量 Tarjan算法
  10. 键盘录入两个整数,求他们的最大公约数