前言

multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值。对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器。那么对于multimap容器来说,find函数将如何运作呢?如果要实现和map容器的find函数同样的功能,则它将返回多个迭代器,这样太复杂了。本文将讲解C++中multimap容器的“ find实现 ”。

解决思路一

摒弃find函数,使用另外两个新函数,它们是专家们为了解决multimap中的“ find操作 ”问题专门设计的:

1. lower_bound():返回一个迭代器,指向键不小于k的第一个元素。

2. upper_bound():返回一个迭代器,指向键大于k的第一个元素。

代码示例

  下面这段代码首先创建一个multimap容器并赋以相关值,然后检索其中某个键,最后输出其对应的所有值:

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4
 5 using namespace std;
 6
 7 int main()
 8 {
 9     multimap<string, string> book;
10
11     /*
12      * multimap容器是不支持下标操作的,因为没有实际意义。
13      * 故我们采取调用insert函数的方法给容器赋值。
14     */
15     book.insert(make_pair("金庸", "倚天屠龙记"));
16     book.insert(make_pair("金庸", "射雕英雄传"));
17     book.insert(make_pair("金庸", "笑傲江湖"));
18     book.insert(make_pair("古龙", "楚留香传奇"));
19     book.insert(make_pair("古龙", "陆小凤传奇"));
20     book.insert(make_pair("黄易", "边荒传说"));
21
22     /*
23      * 使用lower_bound()和upper_bound()获取指向键值匹配元素下界和上界的迭代器
24     */
25     multimap<string, string>::iterator bookit1, bookit2;
26     bookit1 = book.lower_bound("古龙");
27     bookit2 = book.upper_bound("古龙");
28
29     /*
30      * 打印检索结果
31     */
32     cout << "作者: " << bookit1->first << endl << "书名:" << endl;
33     while (bookit1 != bookit2) {
34         cout << bookit1->second << " ";
35         bookit1++;
36     }
37     cout << endl;
38
39     return 0;
40 }

运行结果:

  

解决思路二

  依然摒弃find函数,使用equal函数。它也是专家们为了解决multimap中的“ find操作 ”问题专门设计的。它返回的是一个pair对象,其first成员返回指向匹配元素上界的迭代器,second成员则返回指向匹配元素下界的迭代器。

代码示例

和解决思路一代码示例一样,下面这段代码首先创建一个multimap容器并赋以相关值,然后检索其中某个键,最后输出其对应的所有值:

 1 #include <iostream>
 2 #include <map>
 3 #include <utility>
 4 #include <string>
 5
 6 using namespace std;
 7
 8 int main()
 9 {
10     multimap<string, string> book;
11
12     /*
13      * multimap容器是不支持下标操作的,因为没有实际意义。
14      * 故我们采取调用insert函数的方法给容器赋值。
15     */
16     book.insert(make_pair("金庸", "倚天屠龙记"));
17     book.insert(make_pair("金庸", "射雕英雄传"));
18     book.insert(make_pair("金庸", "笑傲江湖"));
19     book.insert(make_pair("古龙", "楚留香传奇"));
20     book.insert(make_pair("古龙", "陆小凤传奇"));
21     book.insert(make_pair("黄易", "边荒传说"));
22
23     /*
24      * 使用equal_range函数获取指向键值匹配元素下界和上界的迭代器
25     */
26     typedef multimap<string, string>::iterator bookit;
27     pair<bookit, bookit> p = book.equal_range("古龙");
28
29     /*
30      * 打印检索结果
31     */
32     cout << "作者: " << p.first->first << endl << "书名:" << endl;
33     while (p.first != p.second) {
34         cout << p.first->second << " ";
35         p.first++;
36     }
37     cout << endl;
38
39     return 0;
40 }

运行结果:

说明

multiset容器的find实现问题同样可以使用本文所提供的两种方法。

第十三篇:multimap容器和multiset容器中的find操作相关推荐

  1. c++中的set容器和multiset容器

    set容器基本概念 set的特性是,所有元素都会根据元素的键值自动被排序.set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值.set不允许两个元素又相同的键值. 我们不可以 ...

  2. c++STL标准模板库(关联式容器(set,multiset容器))

    关联式容器(associate容器)是STL提供的容器的一种,其中元素与序列容器不同的是它已经排过序,它主要通过关键字的方式来提高查询效率.关联式容器包含set.multiset.map.multim ...

  3. 【C++】【第六篇-2】【黑马 p215~p242】【list容器】【set/multiset容器】【map/multimap容器】【函数对象】【谓词】【内建函数对象】

    [C++][第六篇-2][黑马 p215~p242][list容器][set/multiset容器][map/multimap容器][函数对象][谓词][内建函数对象] 3.7 list容器(p215 ...

  4. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  5. set和multiset容器

    1 set和multiset容器的能力 set 和multiset容器的内部结构通常由平衡二叉树(balancedbinary tree)来实现.当元素放入容器中时,会按照一定的排序法则自动排序,默认 ...

  6. set和multiset容器简介

    set和multiset容器简介 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年06月20日 set 是一个集合容器,其中所包含的元素是唯一的,集合中的元素按 ...

  7. C++STL的set/ multiset容器

    C++STL的set/ multiset容器 set基本概念 set大小和交换 set插入和删除 set查找和统计 set和multiset区别 pair对组创建 set容器排序 set基本概念 简介 ...

  8. 深入理解Tomcat和Jetty源码之第二篇servlet规范和servlet容器

    深入理解Tomcat和Jetty源码之第二篇servlet规范和servlet容器 思维导图总览 这篇推送主要讲servlet的规范和什么是servlet容器? 1.先来讲讲servlet规范: 2. ...

  9. set/multiset容器

    所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器,底层结构是用二叉树实现 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复 ...

最新文章

  1. php 修改文件的权限_php怎么修改文件的权限?
  2. 励志!送女儿去厦大读研后,爸爸回家就考了厦大的博士,现在是女儿的“学弟”...
  3. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点
  4. vue todolist
  5. linux基本命令du,Linux常用操作命令汇总
  6. 你觉得你有那些特质让你比别人更适合做产品经理?
  7. 全栈工程师已经过时?
  8. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案
  9. 基础编程题目集 6-13 折半查找 (15 分)
  10. 嘉年华回顾丨 尚博带你了解腾讯 TXSQL如何 赋能腾讯云分布式数据库 CynosDB
  11. python解决数据不均衡,上采样方法解决
  12. 清空文件夹,或删除文件夹
  13. 教你用 Android 做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划
  14. %@ include file=和jsp:include file=区别
  15. 目录 1.1. JVM内存模型总体架构图 1 1.2. JAVA堆 2 1.3. 方法区 元空间(Metaspace) 2 1.4. 虚拟机栈 3 1.5. 本地方法区 4 2. 垃圾回收算法 4 2
  16. 开发比软件测试好吗,前端开发比软件测试发展好吗?
  17. 如何使用Excel的数据去查询数据库?
  18. Revit导入lumion渲染
  19. 台式计算机搜索不到无线信号,win7电脑搜不到无线信号怎么办_win7找不到无线网络怎么解决-win7之家...
  20. 10大最毒路边小吃盘点,你常吃吗?

热门文章

  1. Android 无法查看外部依赖jar的源码的问题
  2. string类的构造函数,拷贝构造函数,析构函数和赋值函数
  3. 车牌识别EasyPR(4)——字符识别MSER
  4. android 循环弹幕,Android中如何动态获取弹幕内容
  5. 7-2 合并两个有序数组为新的有序数组 (15 分)
  6. 剑指offer-JZ30 包含min函数的栈(C++,附自己的分析)
  7. python中str函数isdigit、isdecimal、isnumeric的区别
  8. 数据库(5)SQL约束
  9. linux防火墙测试,构建基于ipchains的Linux防火墙
  10. html怎么设置字体竖直,CSS3 writing-mode 控制字体竖直显示