greater和less相关的细碎知识总是会忘记,所以这里记一篇用来保存
greater和less是函数对象,也就是仿函数,是一个类,其中包含了一个bool operator()
greator和less常用于算法和容器的比较函数,比如sort、set、map、multiset、multimap,priority_queue
template<class T>
struct greater
{
bool operator()(const T& e1, const T& e2) const //注意这里有const
{
return e1 > e2;//greater ———— e1 大于 e2
}
};
template<class T>
struct less
{
bool operator()(const T& e1, const T& e2) const
{
return e1 < e2;//less ———— e1 小于 e2
}
}
上面我们需要注意的就是return时的比较,这个最好直接记住greater对应e1大于e2,less对应e1小于e2
对于我们使用的容器和算法,比如map set sort都是使用的less作为比较器,对于排序结果来说,是升序排列
所以我们需要记住:
不过有一个例外,priority_queue,优先级队列底层排序用的是堆的结构,在建堆的过程中,默认less函数对象在向下调整的时候找到的是更大的数,也就让更大的数交换到了index更小的位置,也就是说,呈现出了降序排列(在top()、pop()的时候就是swap(_con[0], _con[size - 1]) 然后size-- )
使用标准库中的 graeter< T > less< T > ,标准库中的函数可以直接使用,不需要包头文件
sort()函数中作为参数,这里的参数需要是变量、对象
void test3()
{
int arr[] = { 1, 5, 2, 3, 4 };
vector<int> v(arr, arr + 5);
sort(v.begin(), v.end(), greater<int>());//注意greater<int>是仿函数类型,greater<int>()是创建了一个临时对象
//greater<int> cmp;//创建一个仿函数对象
//sort(v.begin(), v.end(), cmp);//用这个对象,作为第三个比较函数
for (auto e : v)
{
cout << e << " "; // 5 4 3 2 1
}
cout << endl;
}
map…容器中作为模板参数,这里的参数是类型
void test4()
{
map<string, int, less<string>> Mymap;//注意是类型,less<string>是类型,仿函数类型
Mymap.insert(make_pair("epple", 7));
Mymap.insert(make_pair("apple", 3));
Mymap.insert(make_pair("cpple", 10));
for (auto e : Mymap)
{
cout << e.first << ": " << e.second << endl;
}
cout << endl;
priority_queue<int, vector<int>, greater<int>> pq;//priority_queue是适配器,比较函数参数是在第三个,必须把第二个适配的容器vector<int>先写上,再选择使用greater<int>还是less<int>
pq.push(3);
pq.push(10);
pq.push(5);
pq.push(1);
while (!pq.empty())
{
cout << pq.top() << " ";//1 3 5 10
pq.pop();
}
cout << endl;
}
使用自己写的Less Greater仿函数,这里用大写开头是为了与库中的less、greater分辨
template<class T>
struct Greater
{
bool operator()(const T& e1, const T& e2) const //注意const
{
return e1 > e2;
}
};
template<class T>
struct Less
{
bool operator()(const T& e1, const T& e2) const
{
return e1 < e2;
}
}
void test3()
{
int arr[] = { 1, 5, 2, 3, 4 };
vector<int> v(arr, arr + 5);
sort(v.begin(), v.end(), Greater<int>());//注意Greater<int>是仿函数类型,Greater<int>()是创建了一个临时对象
//Greater<int> cmp;//创建一个仿函数对象
//sort(v.begin(), v.end(), cmp);//用这个对象,作为第三个比较函数
for (auto e : v)
{
cout << e << " "; // 5 4 3 2 1
}
cout << endl;
}