第十三篇:multimap容器和multiset容器中的find操作
前言
multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值。对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器。那么对于multimap容器来说,find函数将如何运作呢?如果要实现和map容器的find函数同样的功能,则它将返回多个迭代器,这样太复杂了。本文将讲解C++中multimap容器的“ find实现 ”。
解决思路一
摒弃find函数,使用另外两个新函数,它们是专家们为了解决multimap中的“ find操作 ”问题专门设计的:
1. lower_bound():返回一个迭代器,指向键不小于k的第一个元素。
2. upper_bound():返回一个迭代器,指向键大于k的第一个元素。
代码示例
下面这段代码首先创建一个multimap容器并赋以相关值,然后检索其中某个键,最后输出其对应的所有值:
#include <iostream>
#include <map>
#include <string> using namespace std; int main()
{
multimap<string, string> book; /*
* multimap容器是不支持下标操作的,因为没有实际意义。
* 故我们采取调用insert函数的方法给容器赋值。
*/
book.insert(make_pair("金庸", "倚天屠龙记"));
book.insert(make_pair("金庸", "射雕英雄传"));
book.insert(make_pair("金庸", "笑傲江湖"));
book.insert(make_pair("古龙", "楚留香传奇"));
book.insert(make_pair("古龙", "陆小凤传奇"));
book.insert(make_pair("黄易", "边荒传说")); /*
* 使用lower_bound()和upper_bound()获取指向键值匹配元素下界和上界的迭代器
*/
multimap<string, string>::iterator bookit1, bookit2;
bookit1 = book.lower_bound("古龙");
bookit2 = book.upper_bound("古龙"); /*
* 打印检索结果
*/
cout << "作者: " << bookit1->first << endl << "书名:" << endl;
while (bookit1 != bookit2) {
cout << bookit1->second << " ";
bookit1++;
}
cout << endl; return ;
}
运行结果:

解决思路二
依然摒弃find函数,使用equal函数。它也是专家们为了解决multimap中的“ find操作 ”问题专门设计的。它返回的是一个pair对象,其first成员返回指向匹配元素上界的迭代器,second成员则返回指向匹配元素下界的迭代器。
代码示例
和解决思路一代码示例一样,下面这段代码首先创建一个multimap容器并赋以相关值,然后检索其中某个键,最后输出其对应的所有值:
#include <iostream>
#include <map>
#include <utility>
#include <string> using namespace std; int main()
{
multimap<string, string> book; /*
* multimap容器是不支持下标操作的,因为没有实际意义。
* 故我们采取调用insert函数的方法给容器赋值。
*/
book.insert(make_pair("金庸", "倚天屠龙记"));
book.insert(make_pair("金庸", "射雕英雄传"));
book.insert(make_pair("金庸", "笑傲江湖"));
book.insert(make_pair("古龙", "楚留香传奇"));
book.insert(make_pair("古龙", "陆小凤传奇"));
book.insert(make_pair("黄易", "边荒传说")); /*
* 使用equal_range函数获取指向键值匹配元素下界和上界的迭代器
*/
typedef multimap<string, string>::iterator bookit;
pair<bookit, bookit> p = book.equal_range("古龙"); /*
* 打印检索结果
*/
cout << "作者: " << p.first->first << endl << "书名:" << endl;
while (p.first != p.second) {
cout << p.first->second << " ";
p.first++;
}
cout << endl; return ;
}
运行结果:

说明
multiset容器的find实现问题同样可以使用本文所提供的两种方法。
第十三篇:multimap容器和multiset容器中的find操作的更多相关文章
- multimap容器和multiset容器中的find操作
前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...
- 详解C++ STL multiset 容器
详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...
- STL学习系列八:Set和multiset容器
1.set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...
- STL之Set和multiset容器
1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...
- C++ STL 学习笔记__(7)Set和multiset容器
10.2.8 Set和multiset容器 set/multiset的简介 ² set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指 ...
- STL Set和multiset 容器
STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
- set和multiset容器
set和multiset容器的能力 set 和multiset容器的内部结构通常由平衡二叉树(balanced binary tree)来实现.当元素放入容器中时,会按照一定的排序法则自动排序,默认是 ...
- stl之multiset容器的应用
与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,仅仅是multiset容器同意将反复的元素健值插入.而set容器则不同意. set容器所使用的C++标准头文件set.事实上 ...
- multiset容器erase函数的误用
<从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...
随机推荐
- asp.net生成视图时报错 未引用System.Runtime, Version...
这是没有添加程序集引用 在程序集中添加一条引用 <compilation debug="true" targetFramework="4.5.1"> ...
- QT Unexpected CDB exit 问题的解决办法
行QT进行debug时,提示 Unexpected CDB exit ,The CBD process terminated.. QtCreator 默认是没有调试器的,因此需要用户额外安装. win ...
- ITIL学习心笔记总结
四:价值: 被验证的价值1:革新意识---管理也是第一生产力 被验证的价值2:统一思路---这不是一个人的战斗 被验证的价值3:体系的价值---‘新木桶原理’ ITSM的实施经验表明,“”一流的工程师 ...
- Canvas转换为Blob对象并使用Ajax发送
Canvas转换为Blob对象并使用Ajax发送 转换为Blob对象后,可以使用Ajax上传图像文件. 先从canvas获取dataurl, 再将dataurl转换为Blob对象 var dataur ...
- Laravel建站03--建立前台文章列表和文章详情
经过了前面的开发环境搭建和数据库配置.git配置的准备工作以后,现在可以开始动作做点什么了. 先从简单的开始,那就先来个文章列表和详情页吧. 这期间可以学习到路由.建立model.controller ...
- NIO - Selector源码分析
1. 背景 SelectableChannel对象的多路复用器. 可以通过调用Selector.open()方法创建Selector对象.Selector.open()方法会利用系统默认的Select ...
- C语言第十一回合:预处理命令的集中营
C语言第十一回合:预处理命令的集中营 [学习目标] 1. 宏定义 2. 文件包括"处理 3. 条件编译 预处理命令:能够改进程序设计的 ...
- NYOJ 78 圈水池 (入门级凸包)
题目链接:nyoj 78 单调链凸包小结 题目讲解:本题考查的主要是凸包的用法,算是入门级的吧,当然前提是你接触过,平面几何: AC代码: #include<iostream> #inc ...
- vue天坑系列
vue运行四元素:main.js+router/index.js+index.html+App.vue缺一不可:
- MySql Int 类型和 varchar类型进行比较。
今天遇到个比较奇葩的问题,简单讲就是在Mysql中进行查询的时候 在Where语句中使用的int类型的字段和Varchar类型的字段进行对比. 例如:我这有一张表: 表中的数据如下: 当我进行查询的时 ...