C++ STL容器 —— map/multimap 用法详解
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 用法详解相关推荐
- STL 中map的用法详解
STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...
- map/multimap用法详解
multimap 类 标准模板库多重映射类用于存储和检索集合中的数据,此集合中的每个元素均为包含数据值和排序键的元素对. 键值不需要唯一,用于自动排序数据. 可以直接更改多重映射中的元素值,但不能直接 ...
- js数组中foEach和map的用法详解 jq中的$.each和$.map
数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...
- 【c++】22. STL容器的底层实现详解
文章目录 顺序容器 vector(向量容器) deque(双端队列) list 关联容器 set(集合) multiset map(key,value) multimap 顺序容器 vector(向量 ...
- map函数作用c语言,C语言 · C++中map的用法详解
转载自:http://blog.csdn.net/sunquana/article/details/12576729 一.定义 (1) mapMap; (2) 或者是:typedef mapMym ...
- C++中map的用法详解
转载自:http://blog.csdn.net/sunquana/article/details/12576729 一.定义 (1) map<string, int> Map ...
- auto与迭代器的用法_C++ STL move_iterator移动迭代器用法详解
C++ 11 还为 STL 标准库增添了一种迭代器适配器,即本节要讲的 move_iterator 移动迭代器适配器. move_iterator 迭代器适配器,又可简称为移动迭代器,其可以实现以移动 ...
- [转载]Python:map函数用法详解
一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉.若换成map来实现,则会好很多. 常规方法 map函数 1.map函数介绍及其简单使 ...
- python中map用法详解_Python:map函数用法详解
一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉.若换成map来实现,则会好很多. 常规方法 map函数 1.map函数介绍及其简单使 ...
最新文章
- 兴趣部落的 Git 迁移实践
- E2. 比昨天更多的棒棒糖 (Hard)
- ptrace 系统调用
- php pdo连接oracle乱码,php pdo oracle中文乱码的快速解决方法
- 今天就唠叨唠叨吧……
- AC日记——3的幂的和 51nod 1013
- reading notes -- Amazon.com Recommendations: Item-to-Item Collaborative Filtering
- cad求和插件_黑科技 | 无BIM建模下平面CAD自动生成门窗表
- stack java实现_java实现stack
- centos 安装openoffice (办公软件 WPS)
- (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)
- Elasticsearch-PHP requires cURL, or a custom HTTP handler.
- 安装 Windows 自动化 API 3.0 时,visual Studio 2010 更快地运行
- solr6.6初探之主从同步
- parafac 分解_基于PARAFAC分解的大规模MU-MIMO稀疏信道估计
- HDU2027 统计元音【入门】
- 倒排索引Inverted index
- Jmeter安装步骤
- Real Estate Photography: Exterior at Twilight 房地产摄影:暮光之城 Lynda课程中文字幕
- Matlab imshow, image, imagesc 三者详细分析