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&lt;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 成为语言的一部分之前,直接传递函数非常麻烦。传递structclass 要容易得多。带有operator() 的结构可以像函数一样使用。加上对象可以存储一些数据,这有时很方便。

【讨论】:

这不是一个选择,它是 Functor 的语法。 std::sort 采用 Callable 类型,可以是函数或仿函数(“可调用”类或 lambda)。 你说得对,我不知道 lambdas 和可调用类是由同一个模板处理的。当然,operator() 是唯一一个确保与 lambda 兼容的“方法名”。

以上是关于C++ <algorithm> sort() 使用对象作为比较定义的主要内容,如果未能解决你的问题,请参考以下文章

C++ <algorithm> sort() 使用对象作为比较定义

C++ 用 <algorithm> 屏蔽字符串的所有字符,除了最后 n 个字符

STL

C++中sort的使用;

看看C++快排(sort)源码

C++ STL 常用算法总结