map/multimap

使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理。它们可根据key的排序准则自动将元素排序。multimap允许重复元素,map不允许重复元素。

map和multimap内部的数据结构也是平衡二叉树。

map和multimap根据元素的key自动对元素进行排序,要修改元素的key必须先删除拥有该key的元素,然后插入拥有新的key/value的元素。

常用函数

1.构造函数和析构函数

map m:创建空映射,不包含任何元素

map m(op):以op为排序准则,产生一个空的map

map m1(m2):复制c2中的元素到c1中

map m(const value_type *first, const value_type* last):复制[first, last)之间元素构成新映射

map m(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新映射。

m.~set()销毁所有元素,释放内存

multimap mm:创建空映射,不包含任何元素

multimap mm(op):以op为排序准则,产生一个空的multimap

multimap m1(m2):复制m2中的元素到m1中

multimap m(const value_type *first, const value_type* last):复制[first, last)之间元素构成新映射

multimap m(const value_type *first, const value_type* last,op):以op为排序准则,复制[first, last)之间元素构成新映射

m.~multimap()销毁所有元素,释放内存

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <map>
  4. using namespace std;
  5. bool fncomp (char lhs, char rhs) {return lhs<rhs;}
  6. struct classcomp {
  7. bool operator() (const char& lhs, const char& rhs) const
  8. {return lhs<rhs;}
  9. };
  10. int main ()
  11. {
  12. map<char,int> first;
  13. first['a']=10;
  14. first['b']=30;
  15. first['c']=50;
  16. first['d']=70;
  17. map<char,int> second (first.begin(),first.end());
  18. map<char,int> third (second);
  19. map<char,int,classcomp> fourth;                 // class as Compare
  20. bool(*fn_pt)(char,char) = fncomp;
  21. map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare
  22. return 0;
  23. }

2.大小、判断空函数

int size() const:返回容器元素个数
    bool empty() const:判断容器是否空,若返回true,表明容器已空。

3.增加删除函数

iterator insert(const value_type& x):插入元素x

iterator insert(iterator it,const value_type& x):在迭代指针it处插入元素x
    void insert(const value_type *first,const value_type* last):插入[first, last)之间元素

iterator erase(iterator it):删除迭代指针it处元素

iterator erase(iterator first,iterator last):删除[first, last)之间元素

size_type erase(const Key& key):删除键值等于key的元素

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <map>
  4. using namespace std;
  5. int main ()
  6. {
  7. map<char,int> mymap;
  8. mymap.insert(pair<char,int>('a',10));
  9. mymap.insert(pair<char,int>('z',200));
  10. pair<map<char,int>::iterator,bool> ret;
  11. ret = mymap.insert(pair<char,int>('z',500));
  12. if (ret.second == false)
  13. {
  14. cout<<"element 'z' already existed";
  15. cout<<"with a value of "<<ret.first->second<<'\n';
  16. }
  17. map<char,int>::iterator it = mymap.begin();
  18. mymap.insert(it,pair<char,int>('b',300));
  19. mymap.insert(it,pair<char,int>('c',400));
  20. map<char,int> anothermap;
  21. anothermap.insert(mymap.begin(),mymap.find('c'));
  22. cout<<"mymap contains :\n";
  23. for (it = mymap.begin();it!= mymap.end();it++)
  24. {
  25. cout<<it->first<<"=>"<<it->second<<'\n';
  26. }
  27. cout<<"anothermap contains :\n";
  28. for (it = anothermap.begin();it!= anothermap.end();it++)
  29. {
  30. cout<<it->first<<"=>"<<it->second<<'\n';
  31. }
  32. return 0;
  33. }

上述代码运行结果为

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <map>
  4. using namespace std;
  5. int main ()
  6. {
  7. map<char,int> mymap;
  8. map<char,int>::iterator it;
  9. mymap['a'] = 10;
  10. mymap['b'] = 20;
  11. mymap['c'] = 30;
  12. mymap['d'] = 40;
  13. mymap['e'] = 50;
  14. mymap.insert(pair<char,int>('f',60));
  15. cout<<"initial mymap contains :\n";
  16. for (it = mymap.begin();it!= mymap.end();it++)
  17. {
  18. cout<<it->first<<"=>"<<it->second<<'\n';
  19. }
  20. it = mymap.find('b');
  21. mymap.erase(it);
  22. mymap.erase('c');
  23. it = mymap.find('e');
  24. mymap.erase(it,mymap.end());
  25. cout<<"now mymap contains :\n";
  26. for (it = mymap.begin();it!= mymap.end();it++)
  27. {
  28. cout<<it->first<<"=>"<<it->second<<'\n';
  29. }
  30. return 0;
  31. }

上述代码运行结果为:

如果想往map/multimap中修改一个映射的值,应先插入一个新映射,再把与修改的映射删除。

4.遍历函数

iterator begin():返回首元素的迭代器指针

iterator end():返回尾元素的迭代器指针

reverse_iterator rbegin():返回尾元素的逆向迭代器指针

reverse_iterator rend():返回首元素前一个位置的迭代器指针

5.操作函数

    const_iterator lower_bound(const Key& key):返回键值大于等于key的迭代器指针
    const_iterator upper_bound(const Key& key):返回键值大于key的迭代器指针
    int count(const Key& key) const:返回键值等于key的元素的个数
    pair<const_iterator,const_iterator> equal_range(const Key& key) const:返回容器中键值等于key的迭代指针[first, last)
    const_iterator find(const Key& key) const:查找功能,返回键值等于key的迭代器指针
    void swap(set& s):交换但映射元素
    void swap(multiset& s):交换多映射元素  

6.特殊函数

reference operator[](const Key& k):仅在但映射map类中,可以以数组的形式给映射添加键-值对,并可返回值的引用。

STL:map/multimap用法详解的更多相关文章

  1. STL map 常见用法详解

    <算法笔记>学习笔记 map 常见用法详解 map翻译为映射,也是常用的STL容器 map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器) 1. map 的定义 / ...

  2. STL之六:map/multimap用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8547007 map/multimap 使用map/multimap之前要加入头文件# ...

  3. 2.9 C++STL map/multimap容器详解

    文章目录 2.9.1 引入 2.9.2 代码示例 map案列 multimap案列 2.9.3 代码运行结果 总结 2.9.1 引入 map相对于set区别,map具有键值和实值,所有元素根据键值自动 ...

  4. C++标准模板库(STL)——map常见用法详解

    map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...

  5. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  6. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...

  7. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

  8. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  9. STL queue 常见用法详解

    <算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...

随机推荐

  1. request.url 端口 错误

    今天遇到一个很奇怪的事情,用request.url.port来获取一个请求的端口,返回是80 ,很纳闷啊我的请求上面是http://www.XX.com:8088 啊,怎么会是80啊,太不可思议了! ...

  2. 110个oracle常用函数总结

    . ASCII 返回与指定的字符对应的十进制数; SQL) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- ---- ...

  3. Spring + mybatis 集成

    具体项目可参照:https://github.com/LuoXiaoyi/springmvc 一.环境准备:Spring4.3.5 + Mybatis3.4.6 + Mybatis-Spring 1. ...

  4. Docker常见仓库Nginx

    Nginx 基本信息 Nginx 是开源的高效的 Web 服务器实现,支持 HTTP.HTTPS.SMTP.POP3.IMAP 等协议. 该仓库提供了 Nginx 1.0 ~ 1.7 各个版本的镜像. ...

  5. MySQL系列教程(四)

    文件打开数(open_files) 我们现在处理MySQL故障时,发现当Open_files大于open_files_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应 ...

  6. Docker简介/安装/使用

    什么是Docker?docker是一个开源的应用容器引擎,系统级的轻量虚拟化技术.应用程序的自动化部署解决方案,能够迅速创建一个容器,并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的 ...

  7. JavaMail API 概述

    JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序. JavaMail API提供了一组抽象类定义构成一个邮件系统的对象.它是阅读,撰写和发送电子信息的可选包(标准扩 ...

  8. GC真正的垃圾:强、软、弱、和虚 对象

    垃圾回收的基本思想就是判断一个对象是否可触及性,说白了就是判断一个对象是否可以访问,如果对象对引用了,说明对象正在被使用,如果发现对象没有被引用,说明对象已经不再使用了,不再使用的对象可以被回收,但是 ...

  9. iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等

    1.NSSet的用法 ①NSSet是一种无序集合,基于hash实现,可以在线性时间复杂度内查找某个元素,如果要让元素有序,应当使用NSOrderedSet,要让集合可变,与NSArray类似,使用NS ...

  10. 随机采样和随机模拟:吉布斯采样Gibbs Sampling实现高斯分布参数推断

    http://blog.csdn.net/pipisorry/article/details/51539739 吉布斯采样的实现问题 本文主要说明如何通过吉布斯采样来采样截断多维高斯分布的参数(已知一 ...