zoukankan      html  css  js  c++  java
  • 第十三篇: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实现问题同样可以使用本文所提供的两种方法。

  • 相关阅读:
    Java四种内部类
    Java多态详解
    为啥java要使用 set ()和get()方法---封装
    Python---django轻量级框架
    java 读取数据库数据转化输出XML输出在jsp页面
    操作系统专栏
    learn more ,study less(三):超越整体性学习
    learn more ,study less(二):整体性学习技术(下)
    learn more ,study less(二):整体性学习技术(上)
    Spring博客专栏
  • 原文地址:https://www.cnblogs.com/muchen/p/6352165.html
Copyright © 2011-2022 走看看