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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值