第十三篇: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容器并赋以相关值,然后检索其中某个键,最后输出其对应的所有值:

 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实现问题同样可以使用本文所提供的两种方法。

时间: 2024-08-05 19:28:57

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

set和multiset容器的能力

1 set和multiset容器的能力 set 和multiset容器的内部结构通常由平衡二叉树(balancedbinary tree)来实现.当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序.这种自动排序的特性加速了元素查找的过程,但是也带来了一个问题:不可以直接修改set或multiset容器中的元素值,因为这样做就可能违反了元素自动排序的规则.如果你希望修改一个元素的值,必须先删除原有的元素,再插入新的元素. 2 set和multiset容器的操作

set,multiset容器类型

set和multiset会根据特定的排序准则,自动将元素排序.两者不同处在于multiset允许元素重复而set不允许. 一.集和多集(set 和multiset 容器类) 在使用set和multiset之前,先必须包含头文件<set>#include < set>在其中,set和multiset被定义为命名空间std内的class template: 1 namespace std { 2 template<class T, 3 <class Compare = le

stl之multiset容器的应用

与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,仅仅是multiset容器同意将反复的元素健值插入.而set容器则不同意. set容器所使用的C++标准头文件set.事实上也是multiset容器的头文件.由于这个set头文件也包括multiset所需的红黑树和自身实现文件.仅仅要用宏语句"#include<set>"包括进来,就可对multiset容器的应用代码进行编译. 创建multiset对象 与set容器一样,multiset容器提供例如

multiset容器的应用

与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,只是multiset容器允许将重复的元素健值插入,而set容器则不允许. set容器所使用的C++标准头文件set,其实也是multiset容器的头文件,因为这个set头文件也包含multiset所需的红黑树和自身实现文件,只要用宏语句"#include<set>"包含进来,就可对multiset容器的应用代码进行编译. 创建multiset对象 与set容器一样,multiset容器提供如下构造函

multiset容器erase函数的误用

<从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的误用. AD: 51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验 3.16  multiset容器erase函数的误用 代码示例 int main(){ multiset <int> c1; c1.insert(3); c1.insert(2); c1.insert(3); c

第十三篇 Integration Services:SSIS变量

本篇文章是Integration Services系列的第十三篇,详细内容请参考原文. 简介在前一篇我们结合了之前所学的冒泡.日志记录.父子模式创建一个自定义的SSIS包日志记录模式.在这一篇,我们将升级我们的解决方案为SQL Server 2012 Integration Services,演示SSIS变量,变量配置和表达式管理动态值.在前面的练习中我们已经使用过变量,但我们没有深入学习,这一篇,我们将关注SSIS变量.…………一旦安装好,你可以设置主题颜色,工具->选项->环境->常

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器) STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等 2.容器与算法 案例如下: #include<

顺序容器和关联容器的特点&amp;STL各容器粗略对比

顺序容器和关联容器的特点1.所有的关联容器都会自动排序,但map和set不允许重复元素,而multimap和multiset允许重复元素 2.关联容器中,map和multimap的key和val是分开的,而set和multiset的key和val是相同的 3.除了vector和deque的迭代器为随机迭代器之外,其余容器的迭代器都是双向迭代器,不能进行++操作 4.顺序容器的insert函数的三种形式为: iterator insert(iterator position, value_type

stl中顺序性容器,关联容器两者粗略解释

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时