模拟思路:
map<string,set<PRE>> role,user; 用map存角色和用户的权限
PRE结构体如下:
PRE(string nn,int ll)
{
name=nn; //
level=ll; //不分权限等级权限为-1
}
首先对于role,遍历该role的权限,不分权限等级权限直接push到set里面,如果是带等级权限,如果未找到,直接push,否则选择更大的level,没有则不更新
其次对于user,遍历用户权限,思路和role差不多
查找思路也很简单,可见代码注释
注意:
1.string的find函数找到了返回该字符在字符串的下标,否则返回-1
map和set的find函数找到了返回迭代器(用*it)可以访问,否则返回xx.end
2.注意mutable的使用,不加mutable,定义set,如果用iterator访问,则数据无法修改,见10行和69行
3.set,map的find结构体的话,会根据重载符号查找,见19行和main函数中的find函数。
#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std;
struct PRE{
string name;
mutable int level; //定义set,如果用iterator访问,不加mutable,数据无法修改
PRE(string nn,int ll)
{
name=nn;
level=ll;
}
bool operator<(const PRE & pp) const{ // set/map查找只查询PRE(name,level) 中的name ,无论level是否相等,只要name相同则返回该iterator(也可以自己重新定义)
return name<pp.name;
}
};
map<string,set<PRE>> role,user;
int main()
{
string ss;
int p,r,u,q;
cin>>p;
for(int i=0;i<p;i++) //前一段数据其实没什么用
cin>>ss;
cin>>r; //加入role的权限
for(int i=0;i<r;i++)
{
string role_n;
cin>>role_n;
int num;
cin>>num;
for(int k=1;k<=num;k++)
{
string ss;
cin>>ss;
int xb=ss.find(':');
if(xb==-1) //
{
role[role_n].insert(PRE(ss,-1));
}else{
string name;
int level;
name=ss.substr(0,xb);
level=ss[ss.size()-1]-'0';
auto p=PRE(name,level);
auto tt=role[role_n].find(p);
if(tt==role[role_n].end())
{
role[role_n].insert(PRE(name,level));
}else{
(*tt).level=max(level,(*tt).level); //这里体现了Mutable
}
}
}
}
cin>>u; //加入用户user的权限
for(int i=1;i<=u;i++)
{
string user_n;
cin>>user_n;
int num;
cin>>num;
for(int k=1;k<=num;k++)
{
string ro_name;
cin>>ro_name;
for(auto tt:role[ro_name])
{
PRE t(tt.name,tt.level);
if(user[user_n].find(t)==user[user_n].end())
{
user[user_n].insert(t);
}else{
auto ss=user[user_n].find(t);
(*ss).level=max((*ss).level ,t.level);
}
}
}
}
cin>>q; //开始查询
for(int i=1;i<=q;i++)
{
string check_n;
cin>>check_n;
string str;
cin>>str;
string name;
int level=-1;
if(str.find(':')!=-1)
{
name=str.substr(0,str.find(':'));
level=str[str.size()-1]-'0';
}else name=str;
PRE pp(name,level);
auto tt=user[check_n].find(pp);
if(tt==user[check_n].end()) //user名字都找不到直接返回false
{
cout<<"false";
}else{
if((*tt).level==-1) //如果是不带等级权限的权限 直接说明找到了
cout<<"true";
else{ //否则都是带等级权限
if(level==-1) //如果带等级权限但输入查询权限字符未带等级,输出权限等级
cout<<(*tt).level;
else {
if((*tt).level>=level) //最后一种 比较等级大小即可
cout<<"true";
else cout<<"false";
}
}
}
cout<<endl;
}
return 0;
}
版权声明:本文为weixin_45448563原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。