我想实现一个set,支持先按输入顺序排序,再按照字典序排序。
map<string,int> mp;
bool cmp(string a,string b){
if(mp[a]==mp[b]) return a<b;
return mp[a]>mp[b];
}
set<string,decltype(&cmp)> se(cmp);
string a[5]={"aa","aa","a","a","a"};
signed main()
{
for (string i:a){
mp[i]++;
se.insert(i);
for (string j:se) cout<<j<<" ";
cout<<endl;
}
}
结果如下:
aa
aa
aa a
a aa a
a aa a
显然不满足集合元素的互异性。
然后我加入了特判if(!se.count(i)),发现前一个a和后一个a不算作同一个元素。
然后我用int类型做了一下测试。
map<int,int> mp;
bool cmp(int a,int b){
if(mp[a]==mp[b]) return a<b;
return mp[a]>mp[b];
}
set<int,decltype(&cmp)> se(cmp);
int a[5]={1,1,2,2,1};
signed main()
{
for (int i:a){
mp[i]++;
se.insert(i);
for (int j:se) cout<<j<<" ";
cout<<endl;
}
}
结果如下:
1
1
1 2
1 2
2 1 2
同样出现了类似问题,然而值得玩味的是,string在插入第二个a的时候,就已经不再去重。而int类型直到2的数量大于1的数量时才不再去重。
不难想到,应该是引入了mp之后产生的问题。
但具体怎么解释?为什么两种数据类型效果不一样?
还有还有,如果要实现第一行给到的效果,到底应该怎么办呢?