C++学习 - vector的排序

本文详细介绍了如何使用C++标准库中的sort函数对vector容器进行排序,并提供了升序及降序排序的具体实现方法,包括利用自定义比较函数实现降序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vector 的排序有 sort() 可以调用实现。

#include <algorithm>			//切记包含该头文件

vector<int> v;
v.push_back(1);
v.push_back(5);
v.push_back(6);
v.push_back(2);
v.push_back(4);
v.push_back(8);
v.push_back(17);

sort(v.begin(),v.end());				//这样即可实现 v 各元素的升序排列(sort默认升序)


//以下为降序排序,两种方法:
/*1,调用 sort() 后调用 reverse()		
这里网上很多人没有说清,吃亏了。。。 reverse() 的作用是反转元素,也就是说将原来的第一个放置于新容器的最后一位,第二位放置于倒数第二位,以此类推。
并不是调用 reverse() 就直接降序排列了,切记!!!*/
sort(v.begin(),v.end());
reverse(v.begin(),v.end());


//2,自定义比较函数 comp()    定义放在 main() 外
bool comp(const int & a,const int & b)
{
	return a > b;
}

int main()
{
	...
	之前那一大堆
	...
	sort(v.begin(),v.end(),comp);                  //系统默认比较函数返回:return a < b;
}


<think>好的,我现在需要解释用户提供的C++代码片段中的各个参数意义。用户给出的代码是:`priority_queue<LL, vector<LL>, greater<LL>> pq;`。首先,我需要回忆一下C++中`priority_queue`的模板参数结构。 根据之前的知识,`priority_queue`模板通常有三个参数:元素类型、底层容器类型和比较函数对象类型。这三个参数的默认值分别是:`typename T`, `typename Container = vector<T>`, `typename Compare = less<typename Container::value_type>`。因此,默认情况下,`priority_queue`是一个最大堆,因为使用`less`比较器,但实际排序是最大元素在堆顶。 现在来看用户提供的代码:`priority_queue<LL, vector<LL>, greater<LL>> pq;`。这里的三个参数依次是: 1. `LL`:元素类型,应该是用户自定义的类型或typedef,比如可能是`long long`的缩写。 2. `vector<LL>`:底层容器类型,这里明确指定使用`vector`作为存储元素的容器。 3. `greater<LL>`:比较函数对象,这里使用`greater`,意味着优先队列将按照升序排列,即最小堆,堆顶是最小元素。 接下来需要详细解释每个参数的作用。第一个参数指定队列中存储的元素类型,第二个参数是底层容器,通常使用`vector`或`deque`,第三个参数决定元素的优先级顺序。使用`greater`会导致每次弹出的元素是当前最小的,与默认的`less`相反。 需要注意的是,第三个参数是一个类型,而不是函数对象实例。模板参数需要的是类型,所以在实例化时,`priority_queue`内部会创建该比较器的一个实例。例如,`greater<LL>`是一个类型,而实际的比较函数对象会在队列内部生成。 用户可能的疑问点包括:为什么需要指定底层容器?比较器是如何影响优先队列行为的?这里需要解释底层容器的作用,比如`vector`提供了动态数组的功能,而`deque`可能在某些操作上更高效,但通常`vector`是默认且常用的选择。比较器部分需要强调,使用`greater`会改变堆的排序方式,从而形成最小堆。 另外,可能需要解释`LL`的具体含义,因为这不是C++标准中的类型,可能是用户通过`typedef`定义的,比如`typedef long long LL;`,这样`LL`就代表`long long`类型。 总结各个参数的意义: 1. `LL`:队列中存储的元素类型。 2. `vector<LL>`:用于存储元素的底层容器。 3. `greater<LL>`:比较器类型,决定元素优先级顺序,此处实现最小堆。 最后,用通俗易懂的语言将这些点组织起来,确保用户能够理解每个参数的作用以及整个声明所创建的优先队列的行为。</think>我们可以用「自助餐排队」来理解这个优先队列的声明,先看完整代码: ```cpp priority_queue<LL, vector<LL>, greater<LL>> pq; ``` ### 参数拆解表 🧩 | 参数位置 | 对应代码 | 类比解释 | 技术含义 | |-------------------|------------------|-------------------------------|----------------------------------| | **元素类型** | `LL` | 要处理的数据类型(如牛排/寿司) | 队列中存放的元素类型 | | **底层容器** | `vector<LL>` | 装食物的餐盘类型 | 实现优先队列的存储容器 | | **比较规则** | `greater<LL>` | 优先吃哪种食物的规则 | 决定元素出队顺序的比较器 | --- ### 详细解说 🔍 #### 1️⃣ **元素类型(LL)** - **通俗理解**:就像自助餐要明确是「牛排」还是「寿司」 - **技术说明**:`LL`通常是`typedef long long LL`定义的,表示这个优先队列存储的是长长整型数字 - **代码验证**: ```cpp cout << typeid(pq.top()).name(); // 输出显示存储类型 ``` #### 2️⃣ **底层容器(vector<LL>)** - **通俗理解**:餐盘选择——用普通餐盘装食物(不用特殊容器) - **技术说明**:优先队列默认用`vector`作为存储结构,类似数组但会自动扩容 - **对比实验**: ```cpp // 改用deque容器(双端队列) priority_queue<LL, deque<LL>, greater<LL>> pq2; ``` #### 3️⃣ **比较规则(greater<LL>)** - **通俗理解**:VIP客户优先吃更小块的牛排(最小堆) - **技术说明**:默认是`less<LL>`(大块牛排优先),这里改为从小到大排序 - **可视化演示**: ```cpp pq.push(3); pq.push(1); pq.push(2); // 弹出顺序:1 -> 2 -> 3 ``` --- ### 对比默认声明 🆚 **默认写法**: ```cpp priority_queue<LL> defaultPQ; // 等价于 priority_queue<LL, vector<LL>, less<LL>> ``` - 这个队列就像「大块牛排优先」的自助餐 - 插入顺序:3→1→2 时,弹出顺序是 3→2→1 --- ### 使用场景建议 💡 - **用`greater`的情况**:Dijkstra算法找最短路径、实时获取最小K个数 - **用默认`less`的情况**:合并K个有序链表、实时获取最大K个数 - **容器选择建议**:99%的情况用`vector`即可,除非需要频繁头尾操作才用`deque` ```mermaid graph TD A[声明优先队列] --> B[确定元素类型] A --> C[选择存储容器] A --> D[设置比较规则] B --> E[决定存放什么数据] C --> F[影响扩容效率] D --> G[控制出队顺序] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值