那是一个遥远的小山村:
目录
这一天,学院的老师需要对各位小忍者的信息进行根据名字,年龄,战斗力进行录入,并有效查询出某个战斗力段的最大的那位忍者,于是他求助聪明的我hhh
首先,如果我们采用普通的数组或者vector进行增改,虽然vector在尾部进行插入时候的时间复杂度低,但是要是有那么一天
忍者村放开二胎政策
那忍者学校学生肯定刷刷Shau地涨那么它呢能要跑一天一夜(对),于是,我们用到了multimap函数;
头文件是
#include<map>
multimap和map一样,他们的数据都是pair的对象既:pair(Key,T,less(n))
其中map和mutimap的first和second分别对应Key类型和T类型,都是可以被我指定的数据类型,less()不写就是缺省的升序排序;
考虑到学院里可能存在相同战斗力或者相同名字的忍者,所以现在把刀架在我们脖子上叫我们用multimap(滑稽)//因为map不支持插入相同的Key类型的数据
考虑到pair对象里只能有Key和T类型的数据,所以我们要创建一个T类型的结构体,内包含了小忍者的名字和编号
struct cn{ //定义结构可以让pair的T类型容纳两个小忍者的信息
string name;
int number;
};
写在类里面就是:
class Make_wood { //multimap的class中有value_type 方法
public:
int combat;
struct cn{ //定义结构可以让pair的T类型容纳两个小忍者的信息
string name;
int number;
};
cn cc;//要先定义一个
};
定义一个multimap模板(就是可以省得写那么多):
typedef multimap<int,Make_wood::cn> Cub; //multimap允许存在Key相同的插入
先大概介绍下程序的功能,当老师输入:i(insert)时,就是对容器增加忍者的数据分别是,名字,编号,战斗力;
当老师输入s(search)时,然后老师输入战斗力,找出低于这个战斗力的最大战斗里的最大编号的忍者的信息(好绕hhh)
有必要说一下的就是,对multimap插入pair的数据的方式是:
ninja.insert(Cub::value_type(info.combat,info.cc)); //这里可以换成:
//make_pair(info.combat,info.cc);以为,make_pair是pair内部的方法
这里的ninja表示忍者(multimap的对象)而multimap里有value_type的方法
说了这么多完整的代码是:
#include<iostream>
#include<map>
#include<string>
using namespace std; //木叶村战力排行榜 ,战力信息,代号,姓名
class Make_wood { //multimap的class中有value_type 方法
public:
int combat;
struct cn{ //定义结构可以让pair的T类型容纳两个小忍者的信息
string name;
int number;
};
cn cc;//要先定义一个
};
typedef multimap<int,Make_wood::cn> Cub; //multimap允许存在Key相同的插入
int main()
{
Cub ninja;
Make_wood info;
string i;
int comb;//要查询的战斗力
while(cin>>i)
{
if(i=="i")
{
cin>>info.cc.name>>info.cc.number>>info.combat;
ninja.insert(Cub::value_type(info.combat,info.cc)); //这里可以换成:
continue; //make_pair(info.combat,info.cc);以为,make_pair是pair内部的方法
}
else if(i=="s") //这里的查找是查比这个战斗力小的最大的那个的最大的学号的名字
{
cin>>comb;
Cub::iterator it=ninja.lower_bound(comb);
if(it!=ninja.begin())
{
--it;
int com=it->first;//得到的战斗力
int num=it->second.number;//当战斗力相同时候的最大编号;
Cub::iterator maxit=it;
for(;it!=ninja.begin()&&it->first==com;--it)
{
if(it->second.number>num)
{
num= it->second.number;
maxit=it;
}
}
//因为循环到it==ninja.begin()结束,所以当it和它相等时候没有进行比较
//so
if(it->first==com)
{
if(it->second.number>num)
{
maxit=it;
}
}
cout<<"忍者名称:"<<maxit->second.name<<"忍者编号:"<<maxit->second.number<<"忍者战斗力:"<<maxit->first<<endl;
}
else
{
cout<<"没有战斗力比他小的忍者"<<endl;
}
continue;
}
}
return 0;
}
运行结果: