序列容器是管理数据的宝贵工具,但对大多数应用程序而言,序列容器不提供方便的数据访问机制。一种典型的方法是通过名称来寻找地址。如果记录保存在序列容器中,就只能通过搜索得到这些数据。相比而言,map 容器提供了一种更有效的存储和访问数据的方法。

map 容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。

map<K,T> 类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。容器内对象的位置是通过比较键决定的。

STL map 容器对元素的组织方式并没有具体要求,但元素一般都会保存在一个平衡二叉树中。

从包含 n 个元素的平衡二叉树中检索一个随机元素所需的时间为 O(log2n),从序列中检索元素所需的时间为 O(n)

创建

  1. map<key type,value type> m;
  2.  
  3. map<key type,value type> m{std::make_pair(key1,value1),std::make_pair(key2,value2)}
  4.  
  5. map<key type,value type> m{b};//用另一个map:b来初始化m,m容器中包含b元素副本
  6.  
  7. map<key type,value type> m{b.begin(),b.begin()+};//将map容器b的前三个用来构建m

插入

  1. //定义一个map对象
  2. map<int,string> mapStudents;
  3.  
  4. //第一种,使用insert函数插入pair
  5. mapStudents.insert(pair<int,string>(,"student_one"));
  6.  
  7. //第二种,使用insert函数插入value_type数据
  8. mapStudent.insert(map<int,string>::value_type(,"stident_one"));
  9.  
  10. //以上两种如果key已存在,inset操作不能插入数据的。但是使用数组方式就会覆盖掉以前key对应的value。
  11. //array方式
  12. mapStudents[] = "student_first";
  1. map.insert(pair<char,int>('b',));
  2.  
  3. m.insert(m.begin(), pair<char, int>('a', ));//在begin位置插入元素,也就是在原先map的begin位置前插入元素
  4.  
  5. m2.insert(m1.begin(), m1.end());//用m1初始化m2
  6.  
  7. m.insert(m.begin(), move(pair<char, int>('a', )));//将元素插入到begin前
  8.  
  9. m.insert({{'e', }, {'a', }});//将这两个键值对插入到map中

构造元素

emplace()可以在适当的位置直接构造新元素,从而避免复制和移动操作。

  1. auto pr = m.emplace (key,value);

查找元素

  1. //find返回迭代器指向当前查找元素的位置否则返回map::end()位置
  2. iter = mapStudent.find("");
  3. if(iter != mapStudents.end()){
  4. //iter->second就是读取value值,iter->first就是读取key值
  5. cout << "find,the value is : " << iter -> second << endl;
  6. }
  7. else{
  8. cout << "don't find" << endl;
  9. }

删除与清空元素

  1. //迭代器删除
  2. iter = mapStudent.find("");
  3. mapStudent.erase(iter);
  4.  
  5. //用关键字删除
  6. int n = mapStudent.erase("");//如果删除了返回1,否则返回0
  7.  
  8. //用迭代器删除,把整个map删除
  9. mapStudent.erase(mapStudent.begin(),mapStudent.end());

map的大小

  1. int nSize = mapStudent.size();

基本操作函数

  1. begin() 返回指向map头部的迭代器
  2. clear() 删除所有元素
  3. count() 返回指定元素出现的次数
  4. empty() 如果map为空则返回true
  5. end() 返回指向map末尾的迭代器
  6. equal_range() 返回特殊条目的迭代器对
  7. erase() 删除一个元素
  8. find() 查找一个元素
  9. get_allocator() 返回map的配置器
  10. insert() 插入元素
  11. key_comp() 返回比较元素key的函数
  12. lower_bound() 返回键值>=给定元素的第一个位置
  13. max_size() 返回可以容纳的最大元素个数
  14. rbegin() 返回一个指向map尾部的逆向迭代器
  15. rend() 返回一个指向map头部的逆向迭代器
  16. size() 返回map中元素的个数
  17. swap() 交换两个map
  18. upper_bound() 返回键值>给定元素的第一个位置
  19. value_comp() 返回比较元素value的函数

容器————map的更多相关文章

  1. C++关联容器<map>简单总结

    C++关联容器<map>简单总结 map提供大小可变的关联容器,基于关联键值高效检索元素值.当你处理键值对的数据是,都可以考虑使用map关联容器. 特点: 大小可变的关联容器,基于关联键值 ...

  2. 关联容器——map、set

    map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数.我们通过一个关键字而不是位置来查找值(键值对). 与之相对,set就是关键字的简单集合.当只是想知道一个值是否存在时,set ...

  3. c++中关联容器map的使用

    C++关联容器<map>简单总结(转) 补充: 使用count,返回的是被查找元素的个数.如果有,返回1:否则,返回0.注意,map中不存在相同元素,所以返回值只能是1或0. 使用find ...

  4. spring 中容器 map、set、list、property 的 bean 实例化

    参考:http://www.kaifajie.cn/spring/9966.html <bean id="fieldMap" class="org.springfr ...

  5. 容器--Map和AbstractMap

    一.前言 前面我们介绍了Collection接口的定义及一系列实现,并重点介绍了List体系下的一些实现,对于Collection来说,其实还有Set系列同样很重要,但由于Set是依赖于Map实现的, ...

  6. C++ 之关联容器 map

    标准库定义了四种关联容器:map是其中之一(另外还有set.multimap.multiset).map的元素以键-值(key-value),在学了顺序容器之后,再学习关联容器,就比较比较好理解了. ...

  7. 关联容器(map):支持高效查找的容器,一种键值对的集合。

    #include <iostream> #include <string> #include <map> #include <vector> using ...

  8. java并发容器(Map、List、BlockingQueue)

    转发: 大海巨浪 Java库本身就有多种线程安全的容器和同步工具,其中同步容器包括两部分:一个是Vector和Hashtable.另外还有JDK1.2中加入的同步包装类,这些类都是由Collectio ...

  9. java容器-Map

    Map:基本思想是映射表(维护键-值对),HashMap,TreeMap,LinkedHashMap,ConcurrentHashMap等都是基于Map接口实现的map容器,他们特性不同,表现在效率, ...

  10. ECMA Script 6_唯一容器 Set_映射容器 Map

    唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是 ...

随机推荐

  1. Python 爬取SeeBug poc

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-24 21:42:52 # @Author : EnderZhou (z ...

  2. 思考--mysql 分库分表的思考

    查询不在分库键上怎么办,扫描所有库?由于分库了,每个库扫描很快?所以比单个表的扫描肯定快,可以这样理解吗. 多表jion怎么弄,把内层表发给每个分库吗? citus,tidb 都有这些问题,citus ...

  3. 关于float的小奥秘

    一. float 存储方式 1.1. float 占四个字节 1.2. 浮点数构成 1.2.1. 无论是单精度还是双精度在存储中都分为三个部分: <1>. 符号位(Sign) : 0代表正 ...

  4. <<C++ Primer>> 第二章 变量和基本类型 术语表

    术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节    别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...

  5. url简单加密

    使用urlencode和urldecode可以对传输的字符串进行简单的加密,也可用于将汉字转换为16进制数字进行传输,每个16进制数前面都带一个% urlencode : 将中文转换为16进制数 ur ...

  6. linux:用户和组文件解释(/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow)

    一.用户文件:/etc/passwd [root@pinfun6 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash 1 2 3 4 5 6 7 | ...

  7. Centos7 用gogs搭建git仓库

    0.安装步骤 先安装依赖,然后创建数据库,创建git用户,安装Gogs软件,设置启动,访问web界面进行配置 一.Gogs依赖环境 安装Gogs之前需要配置相应的依赖环境,官网介绍的依赖环境如下: 数 ...

  8. 企业面试题|最常问的MySQL面试题集合(三)

    分区表的原理 分库分表的原理 延伸: MySQL的复制原理及负载均衡 分区表的工作原理 对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区 ...

  9. sublime text 3 环境设置

    1. 设置build system 环境 tool -> build system -> new build system ,粘贴以下代码并保存 { "cmd":[&q ...

  10. iptables - IP包过滤器管理

    总览 iptables -ADC 指定链的规则 [-A 添加 -D 删除 -C 修改] iptables - RI iptables -D chain rule num[option] iptable ...