STL 中make_heap学习

STL中make_heap 的接口为:

default (1)
template <class RandomAccessIterator>
  void make_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
  void make_heap (RandomAccessIterator first, RandomAccessIterator last,
                  Compare comp );

默认的使用operator< 进行比较。而我们可以自定义comp进行比较,来进行建堆。

其中,两个make_heap所使用的参数,[first,last)     这个区间是半开半闭的。

例如:

vector<int>vec(5);
	for (int i=0; i< 5;i++)
	{
		vec[i]=i+2;

	}
	make_heap(vec.begin(),vec.end());

这样我们就建立了一个堆,现在vec中的元素顺序为:

6,5,4,2,3

当我们需要对堆进行存取操作时,我们有函数,pos_heap,push_heap

default (1)
template <class RandomAccessIterator>
  void pop_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
  void pop_heap (RandomAccessIterator first, RandomAccessIterator last,
                 Compare comp);

使用pop_heap 操作后, 最大值被移动到last-1的位置。[first ,last-1) 之间的元素继续保持堆的形态。

我们只需取出最后一个元素即可。也就是vec.pop_back();

default (1)
template <class RandomAccessIterator>
  void push_heap (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
  void push_heap (RandomAccessIterator first, RandomAccessIterator last,
                   Compare comp);

执行push_heap 时, [first,last-1)个元素是保持堆形态的,如果不是堆,则会报错。

这个函数是相当于对堆进行调整。

时间: 2024-10-14 06:18:09

STL 中make_heap学习的相关文章

Gym - 100989D 题学习stl中的set&lt;pair&lt;int ,int &gt; &gt;

题目网址链接:https://vjudge.net/problem/387095/origin 题目大意:给出桌子数和桌子容纳人数,给出几条操作,操作如下:给出顾客人数,问是否有能容纳顾客且桌子标号和桌子容纳人数与顾客人数差值同时最小的桌子,有即输出桌子编号,没有输出-1:期间会有顾客离开,给出离开的桌子编号. 在做题之前,先学习STL中的set:以集合形式从小到大排列set中的元素. 先给出几个大牛博客链接: https://www.cnblogs.com/zyxStar/p/4542835.

stl中char 与wchar 的转换

学习记录: stl中 字符串 str自然对应的是string 宽字符串wchar 对应的是wstring 宽字符串占用两个字节 两者的转换有三种办法 1 windows 的api转换函数WideCharToMultiByte()与MultiByteToWideChar(). 不适合跨平台使用. 2 ATL中CA2W类与CW2A类.或者使用A2W宏与W2A宏.稍显累赘和麻烦 3 使用CRT库的函数 函数和使用方法见下列代码 #include <string> #include <iostr

C++ STL源码学习(map,set内部heap篇)

stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap. template <class _RandomAccessIterator, class _Distance, class _Tp> void __push_heap(_RandomAccessIterator __first, _Distance __holeIndex, _Distance

STL中的vector 和list

参考书目:visual c++ 入门经典 第七版 Ivor Horton著 第十章 认识两个容器:vector和list 容器:是STL(Standard Template Library 标准模板库)的六大组件之一.(容器,容器适配器,迭代器,算法,函数对象,函数适配器) 容器是用来存储和组织其他对象的对象.提供要存储的对象的类型就可以从STL模板中创建容器类. Vector <T>:表示一个在必要时刻可增加容量的数组,该数组存储T类型的元素.只能在矢量容器的末尾添加新元素. Vector

C++ STL中哈希表 hash_map介绍

过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典... 这些信息如果保存下来并不复杂,但是找起来比较麻烦.例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后按照名字一个一个比较.如果要速度快,就需要把这些记录按照字母顺序排列,然后按照二分法查找.但是增加记录的时候同时需要保持记

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

C++11新特性应用--介绍几个新增的便利算法(stl中的heap使用,最大堆)

有的时候为了维护数据,我们使用stl的堆去维护一序列. 首先您要弄清楚堆和栈的区别,即heap和stack stl中的堆默认是最大堆. 先介绍 push_heap,pop_heap,make_heap,sort_heap这四个算法,这四个不是C++11新增加的内容. 首先是如何产生一个最大推: make_heap 原型: template <class RandomAccessIterator> void make_heap (RandomAccessIterator first, Rando

STL中关于map和set的四个问题?

STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: # 为何map和set的插入删除效率比用其他序列容器高? # 为何每次insert之后,以前保存的iterator不会失效? # 为何map和set不能像vector一样有个reserve函数来预分配数据? # 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何? 或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构. C++ STL 之所以得到广泛的赞誉,也被很多人

【STL源码学习】细品vector

第一节:vector简介 vector是一种典型的类模板,使用的时候必须进行实例化. vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长. vector是STL中的最常用容器,并支持STL的通用算法. 第二节:vector的迭代器介绍 vector支持iterator.const_iterator.reverse_iterator.const_reverse_iterator,前两个是正向迭代器,后两个是逆向迭代器. 迭代器支持操作:*操作