C++中的()操作符重载及STL传递比较函数
Posted chenying66
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的()操作符重载及STL传递比较函数相关的知识,希望对你有一定的参考价值。
STL中的()操作符重载
以下内容参考自 《STL源码剖析》
- 许多STL算法都提供了两个版本,一个用于一般状况(如排序时以递增方式排列),另一个用于特殊情况(如排序时由使用者指定以何种特殊关系进行排列)
- 过去C语言,如果想将函数当作参数传递,唯有通过函数指针才能达成,即将自定义规则、条件的函数的对应函数指针作为参数传进来。
- 但是,函数指针有缺点,即它无法持有自己的状态,也无法达到组建技术中的可适配性——即无法再将某些修饰条件加诸于其上而改变其状态
- 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指针指向的当前对象和传入对象进行比较
参考文献:
以上是关于C++中的()操作符重载及STL传递比较函数的主要内容,如果未能解决你的问题,请参考以下文章