首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

sort的用法被搞昏头了解决方法

2012-04-23 
sort的用法被搞昏头了C/C++ codesort函数混淆了 以下是两种菜鸟知道的用法:bool GreatNumber(const int n1

sort的用法被搞昏头了

C/C++ code
sort函数混淆了 以下是两种菜鸟知道的用法:bool GreatNumber(const int n1,const int n2){    if(n1==n2)return false;    else return n1>n2?true:false;}int main(){    int const n=20;    int a[n]={1000,1000,7899,1,9,-23};//sort(a,    a+n,GreatNumber);    sort(a,a+n, less<int>());copy(a,a+n, ostream_iterator<int>(cout," "));return 0;}sort(a,    a+n,GreatNumber);sort(a,a+n, less<int>());第一种,函数的第三个参数是一个函数,函数名在表达式中会隐士转换为函数指针。第二种:less这个类模板,构建了一个临时对象,然后去调用less 这个类模板中的bool operator()const 函数,这是我猜测的。真是奇怪,就算函数指针作为函数参数,那么为什么类模板构建的临时对象也能调用到内部的operator()呢??再比如:第三个问题: class PersonCompare{public:    //其中的Person是一个类,不用管它。    bool operator()(Person const&p1, Person const& p2)    {        return (    p1.GetfirstName()<p2.GetfirstName() ) || ( !(p2.GetlastName()<p1.GetlastName() ) &&            (p1.GetfirstName()<p2.GetfirstName()) ) ;    }}; set<Person,PersonCompare>coll;又如何调用了PersonCompare 中的operator()呢??


[解决办法]
作为一个c++标准控,我用c++标准回答你。

首先,sort函数的声明如下:

template <class RandomAccessIterator, class Compare>
void
sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

你所问的主要涉及class Compare,让我们来分析class Compare是怎样调用函数或者临时对象的operator()的。


首先,

sort(a, a+n, GreatNumber);

编译器会偷偷实例化一个sort模版的函数(implicit instantiation),就像你声明了一个,

void sort(int *a, int *b, bool (*c) (int, int));

GreatNumber是个函数,首先会转换到一个函数指针,所以变量c会被&GreatNumber赋值,即c表示GreatNumber的地址。

其次, sort(a, a+n, less<int>());

编译器会偷偷实例化一个,
void sort(int *a, int *b, less<int> c);

c会被less<int>()所创建的临时对象赋值,就相当于less<int> c = less<int>();
你也许要问,这样不就创建了2次对象吗?是的,是创建了2次,临时对象一次,c一次。但是很多编译器可以优化成只创建一次,直接在c上面创建。

所以虽然less<int>()是一个临时对象,但是c不是临时对象,c可以在函数sort中被用到。

在sort函数中,我只需要
c(x,y)
就可以比较x,y的大小了,无论是函数指针c,还是less<int>的对象c,都可以这样用。

less<int>中重载了bool operator()(int, int)。

热点排行