定义

类似于map,multimap也是存储两个元素之间的映射关系的容器,不相同的是,multimap的key值可以重复出现。另外和map、set一样,multimap的关键字类型也要具有严格弱序的定义。(补:通常不对关联容器使用泛型算法--<<C++ Primer>>)

初始化

  • 创建空的容器:

    std::multimap<char, int> first;

  • 从一个范围构造:

    std::multimap<char, int> second(first.begin(), first.end());

  • 复制构造:

    std::multimap<char, int> third(second);

  • 添加自定义比较:

    struct classcomp {bool operator() (const char& lhs, const char& rhs) const{return lhs<rhs;}
    };std::multimap<char,int,classcomp> fourth;

添加元素

添加元素使用成员函数insert,有以下几种添加元素的形式:

std::multimap<char, int> mymultimap

  • 版本一:添加单个元素

    mymultimap.insert(std::pair<char, int>('a', 100));
    mymultimap.insert({'b', 20});
    //insert()返回指向当前新插入元素的迭代器
    it = mymultimap.insert(std::pair<char, int>('c', 60));
  • 版本二:从一个范围添加

    std::multimap<char, int> hismultimap;
    hismultimap.insert(mymultimap.begin(), mymultimap.find('c'));
  • 版本三:在提示的(Hint)位置添加:

    mymultimap.insert(it, std::pair<char, int>('d', 10));

访问操作

  • 遍历:

    mymultimap.insert (std::pair<char,int>('a',10));
    mymultimap.insert (std::pair<char,int>('b',20));
    mymultimap.insert (std::pair<char,int>('b',150));for(std::mymultimap<char, int>::iterator it = mymultimap.begin(); it != mymultimap.end(); ++it)std::cout << (*it).first << "=>" << (*it).second << "\n"//  output:
    //  a=>10
    //  b=>20;
    //  b=>150;  
  • 查找:

    • 方法一:利用成员函数findcount

      std::multimap<char, int> mymm;
      mymm.insert (std::make_pair('x',10));
      mymm.insert (std::make_pair('y',20));
      mymm.insert (std::make_pair('z',30));
      mymm.insert (std::make_pair('z',40));auto nums = mymm.count('z'); //'z'的数量
      auto iter = mymm.find('z');  //第一个'z'
      while(nums--){cout << iter->second << endl;iter++;
      }
    • 方法二:利用成员函数lower_boundupper_bound

      这两个函数都接受一个查找关键字,返回一个迭代器lower_bound返回的迭代器指向第一个具有给定关键字的元素,upper_bound返回的迭代器指向最后一个匹配给定关键字的元素之后的位置。如果查找元素不存在,两个函数返回的迭代器相等--指向一个不影响排序的关键字插入位置。

      for(auto beg = mymm.lower_bound('z'), end = mymm.upper_bound('z'); beg != end; ++beg)cout << beg->second << endl;
    • 方法三:使用成员函数equal_range

      euqal_range接受一个查找关键字,返回一个迭代器pair。若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。若未找到匹配元素,则两个迭代器都指向关键字可以插入的位置。

      for(auto pos = mymm.equal_range('z'); pos.first != pos.second; ++pos.first)cout << pos.first->second << endl;

删除元素

使用erase删除multimap中的元素,erase有三种形式:

  • 删除指定键值:mymm.erase('a'),返回删除的元素数量

  • 传入一个迭代器:

    it = mymm.find('a');
    mymm.erase(it);
  • 传入两个迭代器,删除一定范围元素

    mymm.erase(it, mymm.end());

转载于:https://www.cnblogs.com/patrolli/p/11281736.html

C++ multimap的用法相关推荐

  1. map和multimap的用法详解

    一.map的文档总结 1.map是关联式容器,它按照key值比较存储,默认是小于: 2.在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容:键值key和valu ...

  2. STL —— multimap的用法详解

    文章目录 multimap的基本性质 STL--multimap容器的用法 multimap容器的创建与初始化 multimap容器包含的成员方法 multimap容器大小 multimap容器中键值 ...

  3. Google Guava 库用法整理

    http://macrochen.iteye.com/blog/737058 参考: http://codemunchies.com/2009/10/beautiful-code-with-googl ...

  4. map,multimap,unordered_map,unordered_multimap的详解

    1,map简介 map是STL的一个关联容器,它提供一对一的hash. 第一个可以称为关键字(key),每个关键字只能在map中出现一次: 第二个可能称为该关键字的值(value): map以模板(泛 ...

  5. map和multimap

    文章目录 1 map和multimap简介 2 map和multimap常用用法 2.1 map/multimap对象的默认构造 2.2 map和multimap对象的带参数构造 2.3 map的插入 ...

  6. C++PrimerPlus(第6版)中文版:Chapter16.4.6关联容器_setops.cpp

    本小节主要讲set的使用方法. 关联容器将值和键关联在一起,并使用键来查找值. 关联容器的优点在于:它提供了对元素的快速访问.插入元素的时候,不需要指定插入位置,因为关联容器是排过序的,它知道新元素来 ...

  7. 【STL学习指南】STL的入门学习指南

    目录 STL 学习指南 一. STL基础 二. C++ STL 容器 1 序列式容器 1.1 array 1.2 vector 1.3 deque 1.4 list 2 关联式容器 2.1 map 2 ...

  8. C++STL标准库学习总结/索引/学习建议

    前言: 如果刚刚开始学习STL标准库,不知道从哪里入手学习的话,建议去中国大学mooc平台,先学习北京大学郭炜老师的<程序设计与算法(一)C语言程序设计>(https://www.icou ...

  9. [STL]六大组件介绍(目录 全)

    一般介绍 STL(Standard TemplateLibrary),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library)中, ...

最新文章

  1. 四次面试:程序员越来越悲催了
  2. Ext Tree异步树的增加修改删除的简单实现~
  3. PyTorch的损失函数和优化器
  4. Java 分割字符串的方法String.split()底层原理
  5. 安卓开源项目周报1220
  6. mysql proxy 管理_ProxyMySQL的Admin管理接口
  7. PYTHON__关于Socket中的Select使用理解
  8. 没错,你离分布式搜索只差一个Elasticsearch入门!
  9. 2013年蓝桥杯软件大赛预赛java本科b组答案_2013年蓝桥杯软件大赛预赛C本科B组试题...
  10. 从fragment启动另一个fragment
  11. 对话诸葛 io 孔淼:数据分析如何做,才能圈住用户?
  12. NYOJ74 - 小学生算术
  13. C++ coredump原因总结(转载)
  14. AndroidStudio测试用例合集(一)
  15. Quicksql部署
  16. Lorenzo Von Matterhorn(暴力)(树)
  17. 洛谷P1046陶陶摘苹果题解--zhengjun
  18. 上了一堂健身课,27岁程序员尿尿像酱油!
  19. ios 全屏返回手势
  20. 计算单目标跟踪器的平均CLE

热门文章

  1. [翻译]Axure-Dynamic Panel(Basic)-原型设计工具Axure学习-第2.1节
  2. web移动端Fixed在Input获取焦点时ios下产生的BUG及处理
  3. 揭开JVM所看到的try/catch/finally
  4. 构建之法读书笔记之五
  5. C语言做一个通讯录程序(在console里面运行)
  6. 微信开放平台 公众号第三方平台开发 教程一 平台介绍
  7. php 降低图像大小,尝试在php中调整图像大小时如何处理此内存泄漏?
  8. log4j 源码解析_log4j1.x设置自动加载log4j.xml
  9. 结构体为什么要4字节对齐
  10. linux命令行 正则,在Linux命令行中使用正则表达式