众所周知,map的key值唯一,value不唯一,经常出现在一些需要统计出现个数的题中
P2373 yyy2015c01 的 IDE 之 Call Stack
建议先看题
struct hs
{
vector<int>v;
string s;
};
我首先定义了一个结构体来储存每个函数名和参数列表,因为参数个数 不确定,所以用vector来存
map<hs, int>mp;
然后声明一个mp来判重
main函数为
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
string a,b;
cin >> a;
for (int i = 0; i < a.length(); i++) a[i] = tolower(a[i]);//全部转化成小写
vector<int >t;中转vector
getchar();//处理enter
getline(cin, b);
if (a == "main")
{
continue;
}
else
{
int p=0;
for (int i = 0; i < b.length(); i++)
{
if(b[i]=='\'')//char类型
{
p = 1;
}
if (b[i] == ',' || b[i] == ')')//int类型
{
t.push_back(p);
p = 0;
}
}
mp[{t,a}]++;
}
}
cout << mp.size();
return 0;
}
一切看上去很完美,
但是
后来经过C++大佬大佬指点,我才发现,原来map内部需要重载<号,因为map去重就是通过交换位置的<比较判断是否相等,比如a<b和b<a,如果都返回false则a和b相等,所以在struct声明中加上<重载
struct hs
{
vector<int>v;
string s;
bool operator <(const hs& x)const
{
if (v == x.v)
return s < x.s;
else
return v < x.v;
}
};