CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

哪个把我这个问题说的让我懂了我给100分!!!

楼主Bobosail(Time++;)2006-04-17 19:15:13 在 C/C++ / C++ 语言 提问

#include<iostream>  
  #include<algorithm>  
   
  using   namespace   std;  
   
  struct   test                                       //测试用结构  
  {  
  int   a;  
  int   b;  
  };  
   
  bool   mm(test   ts1,test   ts2)         //谓词函数  
  {  
  return   ts1.a<ts2.a;  
  }b[5]={{5,5},{3,3},{6,6},{0,0},{9,9}};  
   
  void   main(void)  
  {  
   
  for(i=0;i<5;i++)  
  {  
  cout<<b[i].a<<"\t"<<b[i].b<<endl;  
  }  
                    cout<<endl;  
  sort(b,b+5,mm);  
  for(i=0;i<5;i++)  
  {  
  cout<<b[i].a<<"\t"<<b[i].b<<endl;  
  }  
  }  
   
  这是一个用sort()对结构进行排序的小程序,我自己用来测试sort()用的,谓词也是我自己写的,但就是不知道程序的运行机制,也不知道谓词怎么参加运行的........只是我想把结构根据一个主键来用sort()函数排序时随便乱写的一个谓词...没想到竟然通过了.......想知道一下谓词的运行机制,谢谢. 问题点数:100、回复次数:31Top

1 楼Bobosail(Time++;)回复于 2006-04-17 19:16:48 得分 0

刚刚程序写错了.....现重写如下  
   
  #include<iostream>  
  #include<algorithm>  
   
  using   namespace   std;  
   
  struct   test                                       //测试用结构  
  {  
  int   a;  
  int   b;  
  }b[5]={{5,5},{3,3},{6,6},{0,0},{9,9}};  
   
  bool   mm(test   ts1,test   ts2)         //谓词函数  
  {  
  return   ts1.a<ts2.a;  
  }  
   
  void   main(void)  
  {  
   
  for(i=0;i<5;i++)  
  {  
  cout<<b[i].a<<"\t"<<b[i].b<<endl;  
  }  
                    cout<<endl;  
  sort(b,b+5,mm);  
  for(i=0;i<5;i++)  
  {  
  cout<<b[i].a<<"\t"<<b[i].b<<endl;  
  }  
  }  
  Top

2 楼cunsh(村少)回复于 2006-04-17 19:25:05 得分 0

 
  楼主到vc头文件的algorithm里看看源代码.Top

3 楼Bobosail(Time++;)回复于 2006-04-17 19:25:58 得分 0

=.=||我也有想过。。。。但是觉得眼睛好花。。。Top

4 楼cunsh(村少)回复于 2006-04-17 19:26:49 得分 0

 
  看习惯了就不太花了嘛.Top

5 楼Bobosail(Time++;)回复于 2006-04-17 19:29:25 得分 0

那也对,还是自己再看看吧,努力中....Top

6 楼yuanchuang(元创)回复于 2006-04-17 19:30:22 得分 0

混分!Top

7 楼cunsh(村少)回复于 2006-04-17 19:30:36 得分 0

比如在_Unguarded_partition的两个版本里  
  一个是{for   (;   *_F   <   _Piv;   ++_F)  
  一个是{for   (;   _P(*_F,   _Piv);   ++_F)Top

8 楼yuanchuang(元创)回复于 2006-04-17 19:30:53 得分 0

这到底是怎么了?我好像变成混分专业户了……Top

9 楼cunsh(村少)回复于 2006-04-17 19:33:47 得分 0

 
  哈哈哈.Top

10 楼Bobosail(Time++;)回复于 2006-04-17 19:34:29 得分 0

bool   mm(test   ts1,test   ts2)          
  {  
  return   ts1.a<ts2.a;  
  }  
  我这里的2个参数是怎么传进来的我都不知道...难道是sort(b,b+5);里的b和b+5吗?Top

11 楼Bobosail(Time++;)回复于 2006-04-17 19:42:23 得分 0

-----------------------------------------  
  比如在_Unguarded_partition的两个版本里  
  一个是{for   (;   *_F   <   _Piv;   ++_F)  
  一个是{for   (;   _P(*_F,   _Piv);   ++_F)  
  -----------------------------------------  
  这个说的有道理,有点明白了=.=||Top

12 楼Jiana(Robin.English)回复于 2006-04-17 19:44:29 得分 0

你写的是正确的就对了  
  当你需要按照某种特定方式进行排序时,你需要给sort指定比较函数,否则程序会自动提供给你一个比较函数。    
  你这里自己有mm()了,系统就不会给你一个默认的了,用你的了。  
  你的  
   
  bool   mm(test   ts1,test   ts2)         //谓词函数  
  {  
  return   ts1.a<ts2.a;  
  }  
  说明是以a排序,如果改为  
  return   ts1.b<ts2.b;  
  就以b为排序。  
   
  Top

13 楼corrupt(喜欢 睡在床板下 的思考)回复于 2006-04-17 19:45:10 得分 0

sort()函数里   有一个   默认的排序函数(_p(...)),从小到大  
   
  进行排序时是:   if(_p(a,b))   .....  
   
  现在你自己写了个   _p   函数(就是mm),所以变成了if(mm(a,b))....Top

14 楼Bobosail(Time++;)回复于 2006-04-17 19:49:01 得分 0

哦,也就是说要根据指定主键来排序就写个跟这个函数差不多的谓词就可以了吗?  
  我以前以为谓词函数比较难写就从来都没写过,现在是遇到问题了才忙着写了一个结果运气好.....Top

15 楼Bobosail(Time++;)回复于 2006-04-17 19:51:39 得分 0

对了   ,顺便问一下,这种谓词函数一般是写成全局的还是类的成员函数呢?  
  Top

16 楼Jiana(Robin.English)回复于 2006-04-17 19:52:38 得分 0

这样,从b[0],到b[4]  
  每次比较   系统调用你的mm()  
  如比较b[0],b[1]  
  if(mm(b[0].a,b[1]))成立,   则b[0]小于b[1];Top

17 楼Jiana(Robin.English)回复于 2006-04-17 19:55:33 得分 0

一般是写成全局的还是类的成员函数呢?  
  都可以,看你的具体实现,但全局的要普遍。Top

18 楼Bobosail(Time++;)回复于 2006-04-17 20:01:21 得分 0

哦,谢谢各位了,这个提问效率真高啊,看来要结帖,都回答的好,都不知道怎么给分了,考虑中....Top

19 楼Cccufo(Ccc)回复于 2006-04-17 21:21:04 得分 0

void   sort(RandomAccessIterator   _First,   RandomAccessIterator   _Last);  
  进行非递减排序  
  void   sort  
  (RandomAccessIterator   _First,   RandomAccessIterator   _Last,   BinaryPredicate   _Comp);  
  对满足   BinaryPredicate   _Comp   条件的情况进行排序(true)  
  lz写的  
  bool   mm(test   ts1,test   ts2)         //谓词函数  
  {  
            return   ts1.a<ts2.a;  
  }  
  即按递增排序  
  如果改为   return   ts1.a>ts2.a   的话   就按递减排序  
  lz可以   去看一下msdn   里面有一个很详细的example  
   
               
               
  Top

20 楼xiaoweixp()回复于 2006-04-17 21:45:34 得分 0

#include   "stdafx.h"  
  #include<iostream>  
  #include<algorithm>  
   
  using   namespace   std;  
   
  struct   test                                       //测试用结构  
  {  
  int   a;  
  int   b;  
  }b[5]={{5,5},{3,3},{6,6},{0,0},{9,9}};  
   
  bool   mm(test   ts1,test   ts2)         //谓词函数  
  {  
  return   ts1.a<ts2.a;  
  }  
   
  void   main(void)  
  {  
  int   i;  
  for(i=0;i<5;i++)  
  {  
  cout<<b[i].a<<"\t"<<b[i].b<<endl;  
  }  
                    cout<<endl;  
  sort(b,b+5,mm);  
  for(i=0;i<5;i++)  
  {  
  cout<<b[i].a<<"\t"<<b[i].b<<endl;  
  }  
  }Top

21 楼richard_2010(只爱子寒)回复于 2006-04-17 23:39:26 得分 0

MARKTop

22 楼losedxyz(我真的一无所有)回复于 2006-04-18 08:31:23 得分 0

markTop

23 楼huangxiangzi(E明精人)回复于 2006-04-18 09:28:46 得分 0

关注~!兼职混分Top

24 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-04-18 09:33:48 得分 0

我QQ   17580246,我给你说,你就给我100分嘛?Top

25 楼LiHubei(lhb)回复于 2006-04-18 09:41:07 得分 0

关心的不是重点啊!  
   
  我只看作:sort(T,T,(bool   (*)(T,T)))Top

26 楼hexi0917(撩人月色)回复于 2006-04-18 09:52:29 得分 0

markTop

27 楼langzi8818(┤天道酬勤┝爱老婆┦┷我是来学习滴┷)回复于 2006-04-18 10:18:14 得分 0

啥是胃词Top

28 楼sinall()回复于 2006-04-18 11:30:31 得分 0

bool   mm(const   test&   ts1,const   test&   ts2)         //谓词函数  
  {  
  return   ts1.a<ts2.a;  
  }Top

29 楼shenmea00000(学习中~~~)回复于 2006-04-18 15:54:44 得分 0

学习中~~~~Top

30 楼sharpdew(风刃)回复于 2006-04-18 15:55:06 得分 0

其实很简单,什么谓词函数不谓词函数,就是一个函数指针,用来在sort内部调用来比较大小的,否则系统怎么知道你定义的结构或者类型怎么比较大小呢?!别忘了你在用STL,这里面有很多的泛型操作。Top

31 楼chrisboyer(ChrisBoyer)回复于 2006-04-18 21:01:45 得分 0

sort是个函数模板:  
  template<   class   RandomAccessIterator,   class   Compare   >    
  void   sort(   RandomAccessIterator   first,     RandomAccessIterator   last,   Compare   comp   );  
   
  sort(b,b+5,mm);//这里用test*   和bool   (*)(const   test&   ts1,const   test&   ts2)     实例化。  
   
   
  下面是一个简单冒泡排序的函数模板的例子,你可以参考一下。当然标准库中的sort的模板使用的是效率更高的算法。  
  template<   class   RandomAccessIterator,   class   Compare   >    
  void   mysort(   RandomAccessIterator   first,     RandomAccessIterator   last,   Compare   comp   )  
  {  
          for(int   i=1;   i   <   last-first-1   ;   i++)  
          {  
                  for(RandomAccessIterator   iter2=first   ;   iter2   <   last-i   ;   iter2++)  
                  {  
                          if(!comp(*iter2,*(iter2+1)   )   )  
                                  swap(*iter2,*(iter2+1));  
                  }  
          }  
  }  
   
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:Bobosail

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo