哪个把我这个问题说的让我懂了我给100分!!!
#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




