#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表达式、带括号操作符的类对象。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。
#2
是一个 函数指针,
#3
谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?
#5
compare这里是做函数指针,不是在调用函数
该函数会由sort内部实现代码里调用,这里只是告诉他比较函数
该函数会由sort内部实现代码里调用,这里只是告诉他比较函数
#6
http://en.cppreference.com/w/cpp/algorithm/sort
#7
compare
这是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函数 ,你可以看看
我在指针系列有提到这个问题 : 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
是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : 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
是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : 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表达式、带括号操作符的类对象。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。
#2
是一个 函数指针,
#3
这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。
谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?
#4
http://www.cplusplus.com上没有相应例子代码?
千句解释,不如一行例子。
千句解释,不如一行例子。
#5
compare这里是做函数指针,不是在调用函数
该函数会由sort内部实现代码里调用,这里只是告诉他比较函数
该函数会由sort内部实现代码里调用,这里只是告诉他比较函数
#6
http://en.cppreference.com/w/cpp/algorithm/sort
#7
这是STL里的算法,模板函数,泛型编程,打开头文件algorithm里就有。
第三个参数可以是普通全局或类静态函数、std::function、lambda表达式、带括号操作符的类对象。
谢谢您的回答,请问sort(a, a + 20, compare);这一行,compare的实参是什么?是如何产生的?
compare
这是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函数 ,你可以看看
我在指针系列有提到这个问题 : 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
是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : 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
是一个函数指针,用法是你定义的函数的函数名。我博客中有提到你可以看看。
我在指针系列有提到这个问题 : 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都是可以按索引来查找比较,< >的用法我在 模板中也有提到,加油啊