有关于set的问题若干
  • 板块学术版
  • 楼主Maysoul
  • 当前回复17
  • 已保存回复17
  • 发布时间2023/8/9 09:58
  • 上次更新2023/11/3 05:03:05
查看原帖
有关于set的问题若干
409774
Maysoul楼主2023/8/9 09:58

书接上回

我想实现一个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之后产生的问题。

但具体怎么解释?为什么两种数据类型效果不一样?

还有还有,如果要实现第一行给到的效果,到底应该怎么办呢?

2023/8/9 09:58
加载中...