C++ STL自带的堆_stl 堆

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

q.push(11.1);
q.push(55.5);
q.push(33.3); 

// skip one element
q.pop(); 

// pop and print remaining elements
while (!q.empty())
{
    cout << q.top() << ' ';
    q.pop();
}
cout << endl;

}


2.下面是将节点存在优先队列中的两种方式


**最好**的方式:**这个简洁!**



struct Node
{
int x,y;
bool operator <(Node a) const { return y < a.y; }
bool operator >(Node a) const { return y > a.y; }
};
priority_queue A; //大根堆
priority_queue<Node, vector, greater > B; //小根堆


方式一:



struct Node
{int adj;
int val;
friend bool operator<(const Node &a,const Node &b) { return a.val > b.val; }
};
priority_queueQ;


方式二:(cmp将结构体以val由大到小排列,组成大根堆)**一般也用这个!**



struct Node
{int adj;
int val;
};
struct cmp
{bool operator()(Node a,Node b) { return a.val > b.val; }
};
priority_queue<Node,vector,cmp>Q;


方式三:



struct TMax
{
TMax(int tx):x(tx){}
int x;
};

struct TMin
{
TMin(int tx):x(tx){}
int x;
};

bool operator<(const TMax &a, const TMax &b)
{
return a.x<b.x;
}

bool operator<(const TMin &a, const TMin &b)
{
return a.x>b.x;
}

priority_queue hmax; //大顶堆
priority_queue hmin; //小顶堆


3.下面是将指针存在优先队列中的方式



struct Node
{
short f;
short d;
short fishs;
short times;
short i;
};

struct PCmp
{
bool operator () (Node const *x, Node const *y)
{
if(x->f == y->f)
return x->i > y->i;
return x->f < y->f;
}
};

priority_queue<Node*, vector<Node*>, PCmp > Q;


注:在这种情况下往往可以预分配空间以避免new带来的麻烦。例如:堆中定义Node Qt[26], 栈中的使用则为Node \*tmp1 = Qt。


经过测试,在优选队列当中存指针进行一系列操作要比存节点进行一系列操作快一些。


 


**注:**


1. less<class T>这是大顶堆,按值大的优先,值大的在最上面。greater<class T>这是小顶堆,按值小的优先,值小的在最上面。
2. 自定义cmp如果还有不明白的看这里: 

struct cmp
{

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

79757)**

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

<think>好的,我现在需要帮助用户了解C++ STL的相关用法和实现。首先,我得回忆一下自己对于STL算法的了解,确保信息的准确性。记得在C++的标准模板库中,相关的函数主要位于<algorithm>头文件中,包括make_heap、push_heap、pop_heap和sort_heap等。这些函数通常用于将容器,比如vector,转换为结构,并进行相关操作。 接下来,我需要确认用户的需求。用户提到“的相关用法或实现”,可能想知道如何使用这些函数,以及它们的底层实现原理。因此,我的回答应该包括用法示例和实现机制的简要说明。 首先,关于用法,需要分点说明每个函数的作用。比如,make_heap将范围转换为,push_heap在容器尾部添加元素后调整,pop_heap将顶元素移到末尾并调整剩余部分为,sort_heap将排序为有序序列。需要给出具体的代码示例,比如使用vector<int>来演示这些步骤,并展示输出结果,这样用户能更直观地理解。 然后是关于实现部分。C++标准没有规定具体的算法实现,但通常会是二叉,基于数组的结构。需要解释最大的特性,父节点与子节点的索引关系,以及插入和删除元素时的调整过程,比如sift-up和sift-down操作。这部分需要准确描述算法步骤,确保技术细节正确。 还要注意引用相关的资料,比如用户提供的引用[1]中提到了std::sort可能使用快速排序,虽然不是直接相关,但可以引用来说明STL实现可能因编译器而异,的实现也可能类似。因此,在回答实现部分时,可以提到这一点,增加可信度。 另外,用户的问题可能需要区分和优先队列。虽然STL中的priority_queue默认使用实现,但用户可能混淆这两者,所以应该在相关问题中提及,或者简要说明它们的关系。 需要检查是否有遗漏的函数或细节。例如,STL函数默认是最大,如果想要最小,可以通过比较函数来实现,比如使用greater<int>。这可能在示例中给出,帮助用户了解如何自定义类型。 最后,生成的相关问题要围绕的用法、实现细节、复杂度、与优先队列的关系以及实际应用场景。这些问题应该能引导用户进一步探索,同时覆盖他们可能感兴趣的其他方面。 现在,确保回答结构清晰,分用法和实现两部分,每部分都有子标题,代码示例正确,引用恰当。同时,语言要使用中文,避免技术术语错误,并保持口语化,但不过于随意。</think>### C++ STL 的实现与用法 #### 一、算法核心函数 C++ STL 提供了四个关键操作函数(需包含 `<algorithm>` 头文件): 1. **建** `make_heap` ```cpp std::vector<int> v{3,1,4,1,5}; std::make_heap(v.begin(), v.end()); // 将容器转为最大 // 结果:5,3,4,1,1 ``` 2. **元素入** `push_heap` ```cpp v.push_back(6); // 添加元素到末尾 std::push_heap(v.begin(), v.end()); // 调整结构 // 结果:6,3,5,1,1,4 ``` 3. **元素出** `pop_heap` ```cpp std::pop_heap(v.begin(), v.end()); // 移动顶到末尾 v.pop_back(); // 删除原顶 // 结果:5,3,4,1,1(结构) ``` 4. **排序** `sort_heap` ```cpp std::sort_heap(v.begin(), v.end()); // 转为升序序列 // 结果:1,1,3,4,5(结构被破坏) ``` #### 二、底层实现原理 STL 基于**数组结构的二叉**实现,具体特性: 1. **索引计算** 父节点索引:$(i-1)/2$ 左子节点:$2i+1$,右子节点:$2i+2$ 2. **插入元素时的上浮操作** 新元素置于末尾,通过比较父节点逐步上浮: ```cpp while (pos > 0 && value > parent) { swap(current, parent); pos = (pos-1)/2; } ``` 3. **删除元素时的下沉操作** 顶移除后,末尾元素补位并逐级下沉: ```cpp while (child < heap_size) { if (right_child < heap_size && right_child > left_child) child = right_child; if (arr[child] > current) swap(); else break; } ``` #### 三、时间复杂度对比 | 操作 | 时间复杂度 | 说明 | |------------|------------|---------------------------| | `make_heap`| $O(n)$ | Floyd算法自底向上建 | | `push_heap`| $O(\log n)$| 上浮操作路径长度 | | `pop_heap` | $O(\log n)$| 下沉操作路径长度 | | `sort_heap`| $O(n \log n)$| 相当于排序算法 | >[!NOTE] > 实际性能可能因编译器优化策略不同而变化。例如 GNU libstdc++ 通过位运算优化父子节点计算[^1]。 #### 四、自定义类型示例 ```cpp // 最小实现 std::vector<int> v{5,3,2,4,1}; std::make_heap(v.begin(), v.end(), std::greater<int>{}); // 结构:1,3,2,4,5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值