转自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操作[转]的更多相关文章

  1. C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET

    C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...

  2. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...

  3. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  4. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  5. C++ STL中Map的按Key排序跟按Value排序

    C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...

  6. [STL] Implement "map", "set"

    练习热身 Ref: STL中map的数据结构 C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Re ...

  7. C++ STL 中 map 容器

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

  8. STL中map的使用

    知识点 C++中map提供的是一种键值对容器,里面的数据都是成对出现的.map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的. ...

  9. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

随机推荐

  1. 剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 一 . 理解题意 该题目我们可以借鉴一个非常影响不好的 ...

  2. docker安装及概述

    相关快捷键 退出:Ctrl-D or exit detach:Ctrl-P + Ctrl-Q Docker 核心技术 1.Namespace — 实现Container的进程.网络.消息.文件系统和主 ...

  3. 《SQL 进阶教程》 case:将已有编号方式转换为新的方式并统计

    SQL 权威指南SQL 解惑在进行非定制化统计时,需要将已有编号方式转换为另外一种便于分析的方式进行统计需求 select case when name='哈尔滨' then '黑龙江' when n ...

  4. Ubuntu里let's encrypt通配符证书的自动续期更新

    环境与需求: Ubuntu云服务器上,已经做好了ssl证书的免费申请,但是证书的期限是3个月,3个月到期后必须重新申请或者更新.由于k8s集群里的服务一直在使用证书,每三个月人工更新太麻烦,所以想要配 ...

  5. 049 Group Anagrams 字谜分组

    给定一个字符串数组,将相同字谜组合在一起.(字谜是指颠倒字母顺序而成的字)例如,给定 ["eat", "tea", "tan", " ...

  6. 破解百度翻译页面api参数加密

    我们的目标 https://fanyi.baidu.com/      找到获取翻译的请求 是这个 https://fanyi.baidu.com/v2transapi 查看一下post提交的表单,是 ...

  7. 关于Nginx对于PHP支持的问题

    因为使用的mediawiki是用php写的,所以就遇上了一个问题,怎么让Nginx支持php,记得当时使用apache2的时候是安装了一个叫 “ libapache2-mod-php5 ”的mod , ...

  8. c++笔记3

    一基本语法: 1.1 字符串:支持标准C的 const char* pch=0/"";//不指向任何对象和指向空字符串.C++提供的string类可提供字符串的所有操作,最好是融合 ...

  9. poj 2406 Power Strings 后缀数组解法

    连续重复子串问题 poj 2406 Power Strings http://poj.org/problem?id=2406 问一个串能否写成a^n次方这种形式. 虽然这题用kmp做比较合适,但是我们 ...

  10. 09SpringAopAdvice

    Spring原生的经典模式 实现 AOP 通知: 前置通知:在目标方法执行之前执行,不能改变方法的执行流程和结果! 实现 MethodBeforeAdvice接口! 后置通知:在目标方法执行之后执行, ...