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函数 ...
- stl中顺序性容器,关联容器两者粗略解释
什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...
- 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.事实上 ...
- 详解C++ STL multiset 容器
详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...
随机推荐
- SQL的主键和外键和唯一约束
SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...
- Mysql多列索引实践
在网上看到: 定义:最左前缀原则指的的是在sql where 子句中一些条件或表达式中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要 出现非顺序出现.断层都无法利用到多列索引. 该博文有 ...
- 如何用github展示前端页面
如何在github上展示你的前端页面 参考:https://luozhihao.github.io/demo/ 感谢作者 1.New reposipory 2.进入你本机目录 我是在d:vuedemo ...
- 變更 cut-off,termination current,截止電流 對 battery capacity 的影響
依之前的經驗 2700mAh 電池 cut-off 由 128 降至 64 mA,充電時間延長 20 分鐘, (128 + 64)/2 = 96 取平均充電流, 96 * (20/60) = 32 m ...
- MSB与LSB Big Endian Little Endian
Most Significant Bit, Last(Least) Significant Bit 最高有效位(MSB) 指二进制中最高值的比特.在16比特的数字音频中,其第1个比特便对16bit的字 ...
- 删除指定文件夹下所有的.svn文件夹
sudo find /目录 -name ".svn" -exec rm -r {} \;
- html css的简单学习
html css的简单学习 css的内边距:padding (auto.length.%)(顺序:上.右.下.左)padding-toppadding-leftpadding-rightpadding ...
- Chrome 浏览器如何完美实现滚动截图技巧
一.前言 我们平时在浏览网页时,想把碰到好的网页内容或者文章截屏保存,但是网页的长度常常会超出屏幕高度,一般的截屏功能只能截取显示在屏幕上的内容,那我们该如何方便快捷截取全部内容?今天就分享一个如何利 ...
- [WPF自定义控件库]以Button为例谈谈如何模仿Aero2主题
1. 为什么选择Aero2 除了以外观为卖点的控件库,WPF的控件库都默认使用"素颜"的外观,然后再提供一些主题包.这样做的最大好处是可以和原生控件或其它控件库兼容,而且对于大部分 ...
- layDate 日期与时间组件 入门
首先第一步 在官方下载layDate文件.layUI官网:http://layer.layui.com/ https://www.layui.com/laydate/ layDate文件的下载步 ...