C++ STL容器之 map
map 是一种有序无重复的关联容器。
关联容器与顺序容器不同,他们的元素是按照关键字来保存和访问的,而顺序元素是按照它们在容器中的位置保存和访问的。
map保存的是一种 key - value 的pair对象,其中 key 是关键字,value 是关键字对应的值。通过 key找到对应的 value。map中按照 key的大小升序排列pair对象。
typedef pair<const Key, T> value_type
其中key 是 const的,即不可以改变map中的key。
在map中定位特定的元素比 unordered_map 要慢,因为在 map中需要根据 key的大小进行顺序查找。
但是在map中允许直接选取一定范围的元素。
map在底层通常用二叉搜索树实现。
template < class Key, // map::关键字类型
class T, // map::值类型
class Compare = less<Key>, // map::关键字比较函数
class Alloc = allocator<pair<const Key,T> > // map::allocator类
> class map;
模板参数的第三个 class Compare = less<Key> 是一种比较函数
通过这个比较函数,map能比较两个不同的 key值的大小关系,及是否相等。默认采用 less<Key>, 即 Key 类型的 "<"操作符。
如果 Key类型没有"<"操作符的定义,则需要提供一个自定义比较函数的函数指针,来作为Compare函数。
构造函数
(1) 默认构造: map<Key, value> m; 构造一个空的map,注意,必要时要给出模板参数中的 Compare。需要时给出 Alloc
(2) 范围构造: map<key, value> m(iterator first, iterator last); 将迭代器[frist, last)范围内的元素填入map中
(3) 拷贝构造: map<key, value> m(cosnt map& m2); 用m2构造m
(4) 初始化列表构造: map<key, value> m(initializer_list<value_type> il)
由于map 的 value_type 是 pair类型,所以要构造成pair作为列表,这是三种构造 pair的方式
map<key, value> m{{key k1, value v1},{k2, v2}, ...} // 通过 {}构造 pair
map<key, value> m{make_pair(key k1, value v1), make_pair(k2, v2), ...} // 通过 make_pair() 函数构造 pair
map<key, value> m{pair<key, value>(k1, v1), pair<key, value>(k2, v2), ...} // 通过类型转换构造 pair
赋值操作符=
map& operator= (const map& x) // map赋值
map& operator= (map&& x) // 不懂
map& operator= (initializer_list<value_type> il) // 参数列表赋值
迭代器
begin, end, rbegin, rend
cbegin, cend, crbegin, crend
map 的迭代器支持 ++, -- 操作,但是不支持 +i 操作。
注意 map中是根据 key的值来排列元素的位置的,所以通过迭代器遍历出来的结果顺序,可能和插入值的顺序不同。
另外对 map的迭代器解引用的结果是得到一个 pair类型的对象。它有两个共有成员 first, second。first保存 key的值,second 保存value的值。
由于map的 key 是 const的,所以得到的 pair 的first 也是const 的。
成员函数
容量
empty() // 如果map 为空,返回true。否则返回 false
// bool empty() const noexcept;
size() // 返回map 中元素的大小,即 key-value 的个数
// size_type size() const noexcept;
max_size() // 返回由于存储空间的限制,map有可能包含的最大元素数。但不保证一定能达到这个数量,有可能在中途申请空间失败。
// size_type max_size() const noexcept;
元素访问
操作符[] // m[k] 返回map 中 Key为 k的元素的value的引用。
// 如果 k不存在,那么将会插入一个 key为 k的元素,并返回其默认 value。
// []操作总会将 map的大小 +1
// 注意,对于map,解引用迭代器得到 pair,操作符[]得到 value
at() // m.at(k) 返回map中Key为k的元素的value的引用。
// 如果k不存在,抛一个 out_of_range 异常。
// 使用 at 不会添加元素,不会增加 map的大小
修改
insert 插入
(1) pair<iterator, bool> insert(const pair<key, value> &val);
// 单个值插入,参数为 pair类型,first 为 key, second为 value
// 返回值也是一个 pair,first为插入后的 iterator,second 为bool类型, true表示插入成功,false 表示插入失败
// 插入失败是因为 map 中已经有一个 key 与输入相同。这次插入操作对map 不会有任何影响, 失败时返回值的 first指向已有的key-value
(2) iterator insert(const_iterator pos, const pair<key, value> &val);
// 提示值插入
// 从 pos 指定的位置开始查找 val应该插入的位置
// 如果设定值合适,可以减少插入时做查找的时间
(3) void insert(iterator first, iterator second);
// 范围插入,插入[first, second)范围内的内容
(4) void insert(initializer_list<value_type> il);
// 初始化列表插入
emplace 高效插入
和 insert的主要区别在于,insert首先构造一个临时 value_type对象,再copy到 map中。
而emplace 是直接在map里根据参数构造 value_type对象。更高效。
pair<iterator, bool> emplace(key k, value v);
返回值与 insert情况相同。
emplace_hint 提示位置的高效插入
iterator emplace(const iterator pos, key k, value v);
从pos开始查找应该插入的位置,其余和 emplace相同。
erase 删除
(1) iterator erase(const_iterator position); // 删除迭代器指向的内容, 函数返回 NULL
(2) iterator erase(const_iterator first, const_iterator last); // 删除迭代器范围内的内容,函数返回NULL
(3) size_type erase(const key_type &k); // 删除 type 为k的元素,返回删除的数目。对于 map,成功删除返回1,k不存在则返回0
(4) 1,2中如果迭代器无效,会产生 undefined behavior
swap 交换两个 map对象的内容
(1) void swap(map &x)
(2) void swap(map &x1, map &x2) // 非成员重载函数
clear 清空一个容器的所有元素
void clear() noexcept;
操作
find 查找
在map中查找key 为 k的元素,返回指向它的迭代器。若k不存在,返回 map::end.
// iterator find(const key_type &k);
count 计数
统计map中 key为k的元素的个数,对于map,返回值不是1(存在),就是0(不存在)
// size_type count(const key_type &k) const;
C++ STL容器之 map的更多相关文章
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
- STL容器之map
[1]map容器 map 是关联容器.容器中的每一个元素都是由一个键值和一个数据值组成的. set 是一个集合它以其元素作为键值(同一个键值只能出现一次),且默认以升序排列. list 是一个顺序容器 ...
- [知识点]C++中STL容器之set
零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 继上期的vector之后,我们又迎来了另一个类数组的STL容器——set. 二.用途与特性 set,顾名思义,集合 ...
- [知识点]C++中STL容器之vector
零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...
- iBinary C++STL模板库关联容器之map/multimap
目录 一丶关联容器map/multimap 容器 二丶代码例子 1.map的三种插入数据的方法 3.map集合的遍历 4.验证map集合数据是否插入成功 5.map数据的查找 6.Map集合删除元素以 ...
- STL关联式容器之map和multimap
一,map和multimap的概念 1.map和multimap的基本知识 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中 ...
- C++ 关联容器之map插入相同键元素与查找元素操作
一.插入相同键元素操作 (1)insert方法 在map中的键必须是唯一的,当想map中连续插入键相同但值不同的元素时,编译和运行时都不会发生任何错误,系统会忽略后面的对已存在的键的插入操作,如 ma ...
- STL容器之vector
[1]模板类vector 模板类vector可理解为广义数组.广义数组,即与类型无关的数组,具有与数组相同的所有操作. 那么,你或许要问:既然C++语言本身已提供了一个序列式容器array,为什么还要 ...
- Java容器之Map接口
Map 接口: 1. 实现 Map 接口的类是用来存储键-值(key-value)对: 2. Map 接口的实现类有 HashMap 和 TreeMap 等: 3. Map 类中存储的键-值对,通过键 ...
随机推荐
- P4363 [九省联考2018]一双木棋chess(对抗搜索+记忆化搜索)
传送门 这对抗搜索是个啥玩意儿…… 首先可以发现每一行的棋子数都不小于下一行,且局面可由每一行的棋子数唯一表示,那么用一个m+1进制数来表示当前局面,用longlong存,开map记忆化搜索 然后时间 ...
- [Xcode 实际操作]九、实用进阶-(17)使用CGBlendMode改变UIImage颜色,实现对图片进行混合着色
目录:[Swift]Xcode实际操作 本文将演示如何使用CGBlendMode改变UIImage颜色,实现对图片进行混合着色. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New Fi ...
- MyBatist庖丁解牛(四)
什么是MyBatis-Spring? MyBatis-Spring就是帮助你将MyBatis代码无缝的整合到Spring中.Spring将会加载必要的sqlSessionFactory类和sessio ...
- base64模块
********base64模块******** Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很 ...
- jsp动态图片页面基础
1. 什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 注意:在静态网页中插入flash ,虽然flash是在动的,但是并不是说这个网页就是动态 ...
- Java中的数据类型——通过示例学习Java编程(5)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=15 数据类型用来定义变量可以采用的值,例如,如果变 ...
- MQTT进阶篇
我们介绍了最流行的物联网协议MQTT的背景以及基本使用方法.在这篇文章中,我们会继续考察MQTT的高级玩法——与网页应用的交互.MQTT是基于TCP协议实现,基于HTTP的网页应用便无 ...
- 使用JDBC进行简单的增删改查
JDBC为java的基础.用jdbc实现对数据库的增删改查的功能是程序员的基本要求.本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包. ...
- 简单的UDP程序
接受端: package com.dcz.udp; import java.io.IOException; import java.net.DatagramPacket; import java.ne ...
- ios自定义日期、时间、城市选择器
选择器,我想大家都不陌生,当需要用户去选择某些范围值内的一个固定值时,我们会采用选择器的方式.选择器可以直观的提示用户选择的值范围.统一信息的填写格式,同时也方便用户快速的进行选择,比如对于性别,正常 ...