C++ STL熟悉并巩固(十二)------multimap

本文中的一些重要概念摘自C语言中文网
链接:http://c.biancheng.net/view/388.html

multimap 是一种关联容器,它的每一个元素都是一个键值对。容器中的元素是按关键字(也就是键的值)排好序的。允许有多个关键字的值相同。

同样,作为一个关联容器,我们不能随意更改关键字的值,因为它并不会自动给容器中的元素进行重新排序,因此想要修改容器中的值,应该先删除这个元素,再插入一个元素。

想要使用multimap就必须要包含头文件map

multimap中的元素都是pair模板类对象,把pair对象中的first当做键名,把second当做键值

multimap的成员函数
图片说明

注:find 和 count 不用==运算符比较两个关键字是否相等。如果x比y小和y比x小同时为假,就认为 x 和 y 相等。

了解了这些有用的成员函数之后呢,我们来看一下下面的例题:
例题:一个学生成绩录入和查询系统接受以下两种输入:

1) Add name id score
2) Query score

name 是一个字符串,其中不包含空格,表示学生姓名。id 是一个整数,表示学号。score 是一个双精度浮点数,表示分数。学号不会重复,分数和姓名都可能重复。

两种输入交替出现。
第一种输入表示要添加一个学生的信息,碰到这种输入,就记下学生的姓名、id 和分数。
第二种输入表示要查询分数为 score 的学生的信息,碰到这种输入,就输出已有记录中分数比查询分数低的最高分获得者的姓名、学号和分数。如果有多个学生满足条件,则输出学号最大的学生的信息。如果找不到满足条件的学生,则输出“Nobody”。

输入样例:
Add Jack 12 78
Query 78
Query 81
Add Percy 9 81
Add Marry 8 81
Query 82
Add Tom 11 79
Query 80
Query 81

输出结果样例:
Nobody
Jack 12 78
Percy 9 81
Tom 11 79
Tom 11 79

从题目要求中我们可以看到,这个业务对插入和查询操作需求量比较大,所以肯定不能用顺序容器,因为本身顺序容器是没有排好序的,进行查询操作会比较耗时,是O(n)的时间复杂度,同时由于顺序容器的内存是连续分配的,所以插入效率也不高。这时候我们就要想到关联容器了,由于这里的查找操作是根据分数score来进行的,而分数肯定是可以重复的,所以这时候我们要想到用multimap,让score做键名,让学号和姓名组成的结构做键值。

下面是实现的代码:

#include<iostream>
#include<string>
#include<map>

using namespace std;

class Student
{
    public:
        struct stu_info{ //C++支持在类中定义结构
            string name;
            int id;
        };

        Student() {}

        stu_info st;
        double score;
};

typedef multimap<double, Student> Stu_info;

int main()
{
    Stu_info students;
    string cmd;
    while(cin >> cmd)
    {
        if(cmd == "Add")
        {
            Student student;
            cin >> student.st.name >> student.st.id >> student.score;
            pair<double, Student> s(student.score, student);
            students.insert(s); 
        }
        else if(cmd == "Query")
        {
            double sco = 0;
            cin >> sco;
            Stu_info::iterator i = students.lower_bound(sco);
            if(i != students.begin())
            {
                --i;
                Stu_info::iterator maxp = i;
                int maxid = i->second.st.id;
                for(; i != students.begin() && i->first == sco; --i)
                {
                    if(i->second.st.id > maxid)
                    {
                        maxid = i->second.st.id;
                        maxp = i;
                    }
                }

                if(i->first == sco)
                {
                    maxp = i;
                    maxid = i->second.st.id;
                }

                cout << maxp->second.st.name << " " << maxp->second.st.id 
                    << " " << maxp->first << endl;

            }
            else
            {
                cout << "Nobody" << endl;
            }
        }
    }
    return 0;
}

例题的输出结果:
图片说明

本节完

全部评论

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
湫湫湫不会java:1.在校经历全删了2.。这些荣誉其实也没啥用只能说,要的是好的开发者不是好好学生3.项目五六点就行了,一个亮点一俩行,xxx技术解决,xxx问题带来xxx提升。第一页学历不行,然后啥有价值的信息也没有,到第二页看到项目了,第一个项目九点,第二个项目像凑数的俩点。总体给人又臭又长,一起加油吧兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务