C++中的()操作符重载及STL传递比较函数

Posted chenying66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的()操作符重载及STL传递比较函数相关的知识,希望对你有一定的参考价值。

STL中的()操作符重载

以下内容参考自 《STL源码剖析》

  1. 许多STL算法都提供了两个版本,一个用于一般状况(如排序时以递增方式排列),另一个用于特殊情况(如排序时由使用者指定以何种特殊关系进行排列)
  2. 过去C语言,如果想将函数当作参数传递,唯有通过函数指针才能达成,即将自定义规则、条件的函数的对应函数指针作为参数传进来。
  3. 但是,函数指针有缺点,即它无法持有自己的状态,也无法达到组建技术中的可适配性——即无法再将某些修饰条件加诸于其上而改变其状态
  4. STL算法的特殊版本以仿函数的形式呈现。如果针对某个class进行operator()重载,它就成为一个仿函数

STL传递比较函数进容器的三种方法

1
1、函数指针

bool cmp(const int& l, const int& r)

    return l > r;

函数调用方法:priority_queue<int, vector, bool(*)(const int&, const int&)> q(cmp);
典型C风格写法,即上述所说的通过函数指针将函数作为参数进行传递

2、函数对象

template <typename T>
struct Greater

    bool operator()(const T& l, const T& r) const
    
        return l > r;
    
;

函数调用方法:priority_queue<int, vector, Greater> q;
注意,这里的q是采取默认构造。回顾之前的构造函数,字段comp在默认构造函数是直接用默认构造的,所以这里可以不写参数,而对于函数指针则不同,函数指针不是类,没有构造函数,所以必须添上参数

3、lambda表达式

auto comp = [](const int& lhs, const int& rhs)  return lhs > rhs; ;
priority_queue<int, vector<int>, decltype(comp)> q(comp);

由于lambda表达式类型要无法手写出来,所以C++ 11提供了decltype关键字来取得类型

针对于上述内容进行补充。 对于prioriity_queue,STL中其本身默认为大根堆,采用less函数进行比较

  template< class T ,
	               class Sequence=vector<T> ,
	               classCompare=less<typename Sequence::value_type> > (要一个空格,否则编译器会当做右移操作符,报错)
                   class priority_queue;

所以,可以根据其在自定义对象,如Point类别中,直接重载操作符<,

class point
public:
	int x=0, y=0;
	bool operator< (const point& res) const
		return sqrt(x*x+y*y)>sqrt(res.x*res.x+res.y*res.y);
	
;

注意,对于<操作符,因为定义的类内函数,即使用this指针指向的当前对象和传入对象进行比较

参考文献:

  1. https://www.cnblogs.com/Harley-Quinn/p/6104306.html

以上是关于C++中的()操作符重载及STL传递比较函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL 基础及应用 函数对象(仿函数)

STL重载运算符

C++入门基础教程:STL函数对象

STL中sort排序算法第三个参数_Compare的实现本质

C++ 成员函数指针和 STL 算法

STL 仿函数(函数对象)