网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月20日漏签0天
c++吧 关注:624,959贴子:2,112,539
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 12回复贴,共1页
<<返回c++吧
>0< 加载中...

求助:set<*p,greater<*p> > 重载变成降序,只排了那么几个

  • 只看楼主
  • 收藏

  • 回复
  • 夕阳舞AV
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
struct Stu{
int ID,score;
Stu(int i,int b){ID=i;score=b;}
bool operator >( Stu *s )const{
if( (s->score) > (this->score) )return true;
else if( (s->score) == (this->score) )return true;
else if( (s->score) < (this->score) )return false;
else cout<<"else!!!"<<endl;
}
};
==============
srand(time(0));
set<Stu*,greater<Stu*> > setStu;
set<int,greater<int> > setint;
Stu *pStu=NULL;
cout<<"初始化:"<<endl;
for(int i=0;i<10;i++){
int dd=i+rand()%89;
pStu=new Stu(i,dd);
cout<<pStu->score<<" ";
setStu.insert(pStu);
setint.insert(dd);
}
set<Stu*,greater<Stu*> > 这个好像是按insert(指针地址)降序排列了。
我想要的意思是:按照(Stu *p)->score的值来降序排列set<Stu*,greater<Stu*> >的KEY。。。
我该怎么设置才好。。。


  • 夕阳舞AV
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
哦,标题错了,写了一半才发现是按地址排序了,忘了改下标题的后面的了。


2025-07-20 02:50:24
广告
  • 心之刃
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自己写一个比较器。而且为什么要用指针?


  • 夕阳舞AV
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

用for循环也是没办法erase干净,有没有到end()我也不知道,set<*,比较器>,我注释掉了delete释放内存,不知道怎么回事啊,用的codeblocks。
试了几次就几次都没erase干净。。。哦对了,erase的时候会调用我的比较器。我再去试试


  • 夕阳舞AV
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好吧。。。
我的set.insert要求:指向的new struct地址唯一,就是假如delete释放set(*begin)指向的new struct空间,且set不erase那个(*begin),这时候再执行一次程序,原delete的空间可能会被新new struct占用(xx指针接收此new地址),此时insert(xx),若不比较xx指针指向的地址,set中会出现重复的。。。就是我的set<*stNode,比较器>的前者set元素,虽“本身不同”但是若指向相同的地址是会插入成功的,所以加了第一个new struct的地址比较条件。
我想的是,一般new不会返回重复地址吧,所以想着insert第一个地址比较返回false,去比较第二个条件,来达到以第二条件来间接排序地址KEY。
但是当erase时(清空set元素),就比较第一个条件了,第一个比较条件不成立,就判断第二个条件去了。。。然后
然后我。。。我我就晕了。


  • 雨邻_
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1. 不要直接用stNode*,而是替换为std::shared_ptr<stNode>,这样你删除set中的元素时才会自动调用析构函数;
2. erase不是这样用的,erase(iterator)调用后iterator就失效了,++iterator未定义,并不一定指向下一个元素。如果要全删除的话,直接用clear就好,删除连续几个元素用erase(first,last)。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 12回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示