sort
在C++的标准库中,std::sort是一个用于对容器的元素进行排序的算法。它接受三个参数:
1、需要排序的容器的起始迭代器(包含)。
2、需要排序的容器的结束迭代器(不包含)。
3、可选参数,用于指定排序时的比较函数指针 或 比较函数对象(仿函数)。
第三个参数允许你自定义排序的方式。它可以是一个指向函数的指针,也可以是一个函数对象。这个比较函数或比较函数对象会在排序过程中被调用,用于决定相邻元素之间的顺序。
比较函数或比较函数对象应该满足以下规则:
如果第一个参数小于第二个参数,升序
如果第一个参数大于等于第二个参数,降序
//函数指针
bool compare(int a, int b) {
return a < b; //升序
}
std::vector<int> vec = {3, 1, 4, 1, 5, 9};
std::sort(vec.begin(), vec.end(), compare);
--------------------------------------------------------------
//函数对象(仿函数)
struct Compare {
bool operator()(int a, int b) {
return a < b; //升序
}
};
std::vector<int> vec = {3, 1, 4, 1, 5, 9};
std::sort(vec.begin(), vec.end(), Compare());
使用库里面的排序类
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {3, 1, 4, 1, 5, 9};
// 使用greater进行降序排序
std::sort(vec.begin(), vec.end(), std::greater<int>());
// 输出结果
for (auto i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
greater类的源码
template <typename T>
struct greater
{
constexpr bool operator()(const T& lhs, const T& rhs) const
{
return lhs > rhs;
}
};
priority_queue
std::priority_queue
模板类的三个模板参数都是类型。具体来说,这三个模板参数分别是:
typename T
:指定元素的类型。typename Container = std::vector<T>
:指定基础容器类型,默认值为std::vector<T>
。typename Compare = std::less<typename Container::value_type>
:指定元素排序方式,默认值为std::less<typename Container::value_type>
。
其中,第一个模板参数
T
指定了std::priority_queue
中要存储的元素类型。第二个模板参数Container
指定了底层容器的类型,可以通过指定不同的容器类型实现不同的堆结构。第三个模板参数Compare
指定了元素的排序方式和优先级判断方式,可以使用默认值或通过自定义函数对象类来实现。
因此,当你使用 std::priority_queue
时,需要根据实际需求来选择合适的类型,并进行必要的模板参数传递。
#include <queue>
struct MyCompare {
bool operator()(int a, int b) const {
return a < b; // 从小到大排序
}
};
int main() {
//MyCompare-》类型
std::priority_queue<int, std::vector<int>, MyCompare> pq;
pq.push(3);
pq.push(1);
pq.push(4);
int top = pq.top(); // 值为 1
return 0;
}
#include <queue>
#include <functional>
int main() {
// 使用 std::priority_queue 存储整数,以最小堆的方式排序元素
//std::greater<int>-》类型
std::priority_queue<int, std::vector<int>, std::greater<int>> pq;
// 添加元素
pq.push(3);
pq.push(1);
pq.push(4);
// 获取堆顶元素
int top = pq.top(); // 值为 1
return 0;
}