sort()的第三个参数是什么用法?

时间:2021-10-25 02:43:52
贴上代码:

#include <iostream>
#include <algorithm>
using namespace std;

bool compare(int a, int b)
{
return a > b;
}
int main()
{
int a[20] = { 2,4,1,23,5,76,0,43,24,65 }, i;
cout << "排序前:" << endl;
for (size_t i = 0; i < 20; i++)
{
cout << a[i] << " ";
}
sort(a, a + 20, compare);
cout << "排序后:" << endl;
for (size_t i = 0; i < 20; i++)
{
cout << a[i] << " ";
}
return 0;
}

代码中的compare是怎么个用法,是函数指针,还是委托?
sort(a, a + 20, compare);这一行,compare的实参是什么?

12 个解决方案

#1


这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

#2


是一个     函数指针,

#3


引用 1 楼 sdghchj 的回复:
这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?

#4


http://www.cplusplus.com上没有相应例子代码?
千句解释,不如一行例子。

#5


compare这里是做函数指针,不是在调用函数

该函数会由sort内部实现代码里调用,这里只是告诉他比较函数

#6


http://en.cppreference.com/w/cpp/algorithm/sort

#7


引用 3 楼 Stephen___Qin 的回复:
Quote: 引用 1 楼 sdghchj 的回复:

这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?

compare

引用 3 楼 Stephen___Qin 的回复:
Quote: 引用 1 楼 sdghchj 的回复:

这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?

compare是函数名,本身就是实参,隐式转为&compare,即bool (*)(int,int)类型的函数指针类型

#8


是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : http://blog.csdn.net/redrnt/article/details/72638561
关于stl的算法库,我也有个实战篇  你可以参考一下 :[url=http://blog.csdn.net/redrnt/article/details/70038259][/url
里面的remove_if 函数跟这个相同的用法,当然我也有提到你说的 sort函数 ,你可以看看

#9


// 如果以 C 风格声明描述这个参数类型,那么要写成这样:
void sort(int *, int *, bool (*)(int, int));
// 不过这个写法看起来很不直观,对于不熟悉 C 的有点难理解。

// 如果通过 typedef 定义一个新类型,那么上述声明可以写成这样:
typedef bool (*CompareFunctionPtr)(int, int);
void sort(int *, int *, CompareFunctionPtr);

// 即,第三个参数是一个函数指针。该指针类型为指向“有两个 int 参数且返回值为 bool”的函数。
// 你列出的代码中的 compare 函数,就是参数所需要的函数指针指向的函数类型的一个具体实例:
bool compare(int a, int b)
{
return a > b;
}

// 由于参数要求函数指针。得到指针,即取指针,要使用 & 即取地址运算符:
sort(&arr[0], &arr[20], &compare);
// 但现在的 C/C++ 编译器通常也把函数名视为函数指针常量,所以也可写作:
sort(&arr[0], &arr[20], compare);

// C++ 中稍微复杂一些,有不同的重载以及最新的 lanmbda 表达式支持。

#10


谢谢各位的慷慨解答,我收获良多,再次感谢

#11


引用 8 楼 redRnt 的回复:
是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : http://blog.csdn.net/redrnt/article/details/72638561
关于stl的算法库,我也有个实战篇  你可以参考一下 :[url=http://blog.csdn.net/redrnt/article/details/70038259][/url
里面的remove_if 函数跟这个相同的用法,当然我也有提到你说的 sort函数 ,你可以看看

我看了你实现指针系列的sort函数,感觉if (cmp(vec[i], vec[rh]) < 0) rh = i;是关键.一开始一直不明白sort(vec, sortIgnoringCase)中并没有指明sortIgnoringCase的s1和s2是谁,怎么会实现排序的呢.后来发现cmp(vec[i], vec[rh]) < 0这里给出了答案.很好的例子.

#12


引用 11 楼 Stephen___Qin 的回复:
Quote: 引用 8 楼 redRnt 的回复:

是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : http://blog.csdn.net/redrnt/article/details/72638561
关于stl的算法库,我也有个实战篇  你可以参考一下 :[url=http://blog.csdn.net/redrnt/article/details/70038259][/url
里面的remove_if 函数跟这个相同的用法,当然我也有提到你说的 sort函数 ,你可以看看

我看了你实现指针系列的sort函数,感觉if (cmp(vec[i], vec[rh]) < 0) rh = i;是关键.一开始一直不明白sort(vec, sortIgnoringCase)中并没有指明sortIgnoringCase的s1和s2是谁,怎么会实现排序的呢.后来发现cmp(vec[i], vec[rh]) < 0这里给出了答案.很好的例子.


恩恩 vector是个容器,可以把字符串装进里面。所以是s1 s2都是可以按索引来查找比较,< >的用法我在 模板中也有提到,加油啊

#1


这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

#2


是一个     函数指针,

#3


引用 1 楼 sdghchj 的回复:
这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?

#4


http://www.cplusplus.com上没有相应例子代码?
千句解释,不如一行例子。

#5


compare这里是做函数指针,不是在调用函数

该函数会由sort内部实现代码里调用,这里只是告诉他比较函数

#6


http://en.cppreference.com/w/cpp/algorithm/sort

#7


引用 3 楼 Stephen___Qin 的回复:
Quote: 引用 1 楼 sdghchj 的回复:

这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?

compare

引用 3 楼 Stephen___Qin 的回复:
Quote: 引用 1 楼 sdghchj 的回复:

这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。

谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?

compare是函数名,本身就是实参,隐式转为&compare,即bool (*)(int,int)类型的函数指针类型

#8


是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : http://blog.csdn.net/redrnt/article/details/72638561
关于stl的算法库,我也有个实战篇  你可以参考一下 :[url=http://blog.csdn.net/redrnt/article/details/70038259][/url
里面的remove_if 函数跟这个相同的用法,当然我也有提到你说的 sort函数 ,你可以看看

#9


// 如果以 C 风格声明描述这个参数类型,那么要写成这样:
void sort(int *, int *, bool (*)(int, int));
// 不过这个写法看起来很不直观,对于不熟悉 C 的有点难理解。

// 如果通过 typedef 定义一个新类型,那么上述声明可以写成这样:
typedef bool (*CompareFunctionPtr)(int, int);
void sort(int *, int *, CompareFunctionPtr);

// 即,第三个参数是一个函数指针。该指针类型为指向“有两个 int 参数且返回值为 bool”的函数。
// 你列出的代码中的 compare 函数,就是参数所需要的函数指针指向的函数类型的一个具体实例:
bool compare(int a, int b)
{
return a > b;
}

// 由于参数要求函数指针。得到指针,即取指针,要使用 & 即取地址运算符:
sort(&arr[0], &arr[20], &compare);
// 但现在的 C/C++ 编译器通常也把函数名视为函数指针常量,所以也可写作:
sort(&arr[0], &arr[20], compare);

// C++ 中稍微复杂一些,有不同的重载以及最新的 lanmbda 表达式支持。

#10


谢谢各位的慷慨解答,我收获良多,再次感谢

#11


引用 8 楼 redRnt 的回复:
是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : http://blog.csdn.net/redrnt/article/details/72638561
关于stl的算法库,我也有个实战篇  你可以参考一下 :[url=http://blog.csdn.net/redrnt/article/details/70038259][/url
里面的remove_if 函数跟这个相同的用法,当然我也有提到你说的 sort函数 ,你可以看看

我看了你实现指针系列的sort函数,感觉if (cmp(vec[i], vec[rh]) < 0) rh = i;是关键.一开始一直不明白sort(vec, sortIgnoringCase)中并没有指明sortIgnoringCase的s1和s2是谁,怎么会实现排序的呢.后来发现cmp(vec[i], vec[rh]) < 0这里给出了答案.很好的例子.

#12


引用 11 楼 Stephen___Qin 的回复:
Quote: 引用 8 楼 redRnt 的回复:

是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : http://blog.csdn.net/redrnt/article/details/72638561
关于stl的算法库,我也有个实战篇  你可以参考一下 :[url=http://blog.csdn.net/redrnt/article/details/70038259][/url
里面的remove_if 函数跟这个相同的用法,当然我也有提到你说的 sort函数 ,你可以看看

我看了你实现指针系列的sort函数,感觉if (cmp(vec[i], vec[rh]) < 0) rh = i;是关键.一开始一直不明白sort(vec, sortIgnoringCase)中并没有指明sortIgnoringCase的s1和s2是谁,怎么会实现排序的呢.后来发现cmp(vec[i], vec[rh]) < 0这里给出了答案.很好的例子.


恩恩 vector是个容器,可以把字符串装进里面。所以是s1 s2都是可以按索引来查找比较,< >的用法我在 模板中也有提到,加油啊