前言

  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 ;
  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 ;
  40. }

  运行结果:

  

说明

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

multimap容器和multiset容器中的find操作的更多相关文章

  1. 第十三篇:multimap容器和multiset容器中的find操作

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

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

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  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. 详解C++ STL multiset 容器

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

随机推荐

  1. zoj 3790 Consecutive Blocks 离散化+二分

    There are N (1 ≤ N ≤ 105) colored blocks (numbered 1 to N from left to right) which are lined up in ...

  2. OpenStack 通用设计思路

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  3. hdu 4932 BestCoder Round #4 1002

    这题真是丧心病狂,引来今天的hack狂潮~ Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  4. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  5. 算法 & 数据结构——收纳箱算法???

    . 最近工作上有一个需求,需要将图片打包成图集,以便于让资源更紧凑,利用率更高,提升性能,游戏行内的同志应该很熟练这个操作.通常我们需要用一个app来完成这项工作,最出名的莫过于Texture Pac ...

  6. 模块化开发(seajs)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Hibernate游记——装备篇《三》(连接池的使用)

    这里介绍几种最常见的连接池配置: [说明:在hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp有BUG,在某些种情 ...

  8. JVM 常量池

    最近正好在研究这个问题,题主问题本身是有问题的,在JDK7中HotSpot的常量池是放在Java Heap中,并非题目中的native memory中.在JDK6中是放在Perm Space.题主可以 ...

  9. 补充==的使用和equals的区别

    字节码的比较     Class 相等与否使用“==” 进行比较,形如 if (adapter == IContentOutlinePage.class)  进行比较,因为字节码在JVM中只有一份,地 ...

  10. Java加密技术(八)——数字证书

    原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...