c++实现的木叶忍者村管理

那是一个遥远的小山村:

这一天,学院的老师需要对各位小忍者的信息进行根据名字,年龄,战斗力进行录入,并有效查询出某个战斗力段的最大的那位忍者,于是他求助聪明的我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;


	 
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值