STL之map操作[转]
转自https://www.cnblogs.com/yutongzhu/p/5884269.html 作者彼得朱
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;
STL之map操作[转]的更多相关文章
- C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET
C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- C++ STL中Map的按Key排序跟按Value排序
C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...
- [STL] Implement "map", "set"
练习热身 Ref: STL中map的数据结构 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re ...
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- STL中map的使用
知识点 C++中map提供的是一种键值对容器,里面的数据都是成对出现的.map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的. ...
- STL之map与pair与unordered_map常用函数详解
STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...
随机推荐
- js函数-构成
前言 函数是一种封装,在任何语言中都是一个核心概念.在js中,函数是做为对象的子类型存在的.可以拥有自己的属性和方法,可以做为值进行传递,这两个特性让js拥有使用函数式编程的能力. 函数的声明 字面量 ...
- InstelliJ IDEA使用js+servlet+ajax入门
对于Ajax,我们先了解三点(完整的JS代码在后面) 一.Ajax的出现对javascript的影响. Ajax是微软提出的一种允许客户端脚本发送HTTP请求的技术(XMLHTTP),拯救了大多数ja ...
- 02.Jquery Mobile介绍以及Jquery Mobile页面与对话框
一.为什么要学Jquery Mobile JqueryMobile 是jquery的移动版本,懂基本的jquery知识,会简单的html+css就可以完成很多复杂的功能,还有就是这个框架在企业中用 ...
- STP-9-处理RSTP中的拓扑变化
STP能识别四种不同的拓扑变化事件, 而RSTP只有当非边界端口从非转发状态变为转发状态才认为发生了拓扑变化事件 因为刚变为转发状态的端口可以为一些mac地址提供比之前更好的路径,CAM表需要更新.失 ...
- XHR的跨域请求和JSONP详解
首先:什么是跨域? Cross Domain Request:从一个资源请求另一个资源,二者所在的请求地址不同,域名不同.端口号不同.请求协议不同. 它是由浏览器的同源策略造成的,是浏览器对JavaS ...
- Web自动化测试—PO设计模式(一)
前言 很多的测试同学懂得使用selenium进行Web自动化测试, 但是不知道如何去写一个测试框架,或者说是一个容易维护的web自动化项目. 自己写一个最基本的web自动化测试框架需要会什么? 1. ...
- 关于使用rancher部署k8s集群的一些小问题的解决
问题一: 在rancher的ui上,不能创建k8s的master节点的高可用集群.创建k8s集群,添加节点的时候,可以添加多个master,但是多个master又没有高可用,只要其中一个出问题了,那么 ...
- JAVA基础之项目分包
个人理解: 项目分层分包适合多人开发合作的,最好一个界面设置一个view,同时注释一定设置好,按照顺序:从前向后进行传递参数,从后向前进行传递返回值来进行判断是否真正的执行了sql语句(可以不返回), ...
- vue2.0:(七)、vue-resource
本篇文章开始前,先介绍下什么是vue-resource,并且现在还有一个axios. Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必 ...
- ABAP日期和时间运算
"日期运算是以天为单位,时间运算以秒为单位.DATA:date1 TYPE d. "服务器当前日期date1 = sy-datum.WRITE: / date1 . "2 ...