前言

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操作的更多相关文章

  1. multimap容器和multiset容器中的find操作

    前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...

  2. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

  3. STL学习系列八:Set和multiset容器

    1.set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...

  4. STL之Set和multiset容器

    1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...

  5. C++ STL 学习笔记__(7)Set和multiset容器

    10.2.8 Set和multiset容器 set/multiset的简介 ²  set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指 ...

  6. STL Set和multiset 容器

    STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...

  7. set和multiset容器

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

  8. stl之multiset容器的应用

    与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,仅仅是multiset容器同意将反复的元素健值插入.而set容器则不同意. set容器所使用的C++标准头文件set.事实上 ...

  9. multiset容器erase函数的误用

    <从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...

随机推荐

  1. PHP-客户端的IP地址伪造、CDN、反向代理、获取的那些事儿

    外界流传的JAVA/PHP服务器端获取客户端IP都是这么取的: 伪代码: 1)ip = request.getHeader("X-FORWARDED-FOR")     可伪造,参 ...

  2. Jboss as 服务器基本设置

    http://www.cnblogs.com/lovingprince/archive/2009/09/03/2166307.html Step one: download JBoss Applica ...

  3. js+css简单效果(幕布,跑马灯)

    2.js普通的盒子,css的优先级 css的优先级 !important >>>>>  style 行内样式  >>>>> #id选择器 # ...

  4. 聚合类新闻client的改进

         zaker和鲜果是最早的聚合类新闻产品.前几年发展非常快.迅速占据了市场,但近两年发展变得缓慢.而今日头条自公布以来才两年.用户量就迅速超过了zaker和鲜果.使用起来非常easy,左右滑动 ...

  5. Hive 数据倾斜原因及解决方法(转)

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...

  6. JS -判断、监听屏幕横竖屏切换事件

    通过监听window.orientationchange事件,当横竖屏切换事件时触发 <!doctype html> <html> <head> <title ...

  7. Atitit.ui控件---下拉菜单选择控件的实现select html

    Atitit.ui控件---下拉菜单选择控件的实现select   html 1. 调用& model的实现 1 2. -----select.jsp------ 1 1. 调用& m ...

  8. PHP系统学习2

    字符串操作 字符串截取 substr() 字符串格式化printf()格式化无需echo sprintf() 需要echo nl2br()可以将\n转换成<br/> wordwrap() ...

  9. NSArray、NSMutableArray和NSMutableDictionary的用法

    转自:http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt=1 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域 ...

  10. zepto,kissy前端框架实现跨域

    三.jsonp的原理:带有src属性标签的跨域资源获取能力,在jsonp中通常使用<script>标签,因为<script>标签获取的跨域资源可以使用回调函数直接处理 json ...