C++ <algorithm> sort() 使用对象作为比较定义
Posted
技术标签:
【中文标题】C++ <algorithm> sort() 使用对象作为比较定义【英文标题】:C++ <algorithm> sort() using object as comparison definition 【发布时间】:2020-01-11 22:34:30 【问题描述】:http://www.cplusplus.com/reference/algorithm/sort/
我正在这里阅读此参考资料,这让我很困惑。使用myobject
进行排序如何在std::sort (myvector.begin(), myvector.end(), myobject)
行中工作?还有bool operator() (int i,int j) return (i<j)
是如何超载的?我不明白()
是如何过载的,但我可以看出它与myobject
的使用方式有关。
// sort algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
bool myfunction (int i,int j) return (i<j);
struct myclass
bool operator() (int i,int j) return (i<j);
myobject;
int main ()
int myints[] = 32,71,12,45,26,80,53,33;
std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
// using object as comp
std::sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
【问题讨论】:
我认为从cppreference 阅读相同的文档可能会有所帮助。以后更喜欢cppreference。如果这没有帮助,那么请澄清您是在询问重载的工作原理还是 std::sort 如何使用重载运算符进行比较 【参考方案1】:我不明白 () 是如何重载的
我想没有什么可以理解的。它只是一个名称很奇怪的成员方法(声明/定义中的operator()
),并且以一种奇怪的方式调用(@987654322@ 而不是object.ordinary_method()
)。这只是语法糖,没有黑魔法。
对象充当一种传递函数的代理。在 lambda 成为语言的一部分之前,直接传递函数非常麻烦。传递struct
或class
要容易得多。带有operator()
的结构可以像函数一样使用。加上对象可以存储一些数据,这有时很方便。
【讨论】:
这不是一个选择,它是 Functor 的语法。std::sort
采用 Callable 类型,可以是函数或仿函数(“可调用”类或 lambda)。
你说得对,我不知道 lambdas 和可调用类是由同一个模板处理的。当然,operator()
是唯一一个确保与 lambda 兼容的“方法名”。以上是关于C++ <algorithm> sort() 使用对象作为比较定义的主要内容,如果未能解决你的问题,请参考以下文章
C++ <algorithm> sort() 使用对象作为比较定义