C++ Boost Heap使用实例详解

 更新时间:2022年11月03日 09:27:54   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

一、说明Boost.Heap

Boost.Heap 也可以称为 Boost.PriorityQueue,因为该库提供了几个优先级队列。但是,Boost.Heap 中的优先级队列与 std::priority_queue 不同,它支持更多功能。

二、功能示例

示例 17.1。使用 boost::heap::priority_queue

#include <boost/heap/priority_queue.hpp>
#include <iostream>
using namespace boost::heap;
int main()
{
  priority_queue<int> pq;
  pq.push(2);
  pq.push(3);
  pq.push(1);
  for (int i : pq)
    std::cout << i << '\n';
  priority_queue<int> pq2;
  pq2.push(4);
  std::cout << std::boolalpha << (pq > pq2) << '\n';
}

Example17.1

示例 17.1 使用了 boost::heap::priority_queue 类,该类在 boost/heap/priority_queue.hpp 中定义。一般来说,这个类的行为类似于 std::priority_queue,除了它允许你迭代元素。迭代中返回的元素顺序是随机的。

boost::heap::priority_queue 类型的对象可以相互比较。示例 17.1 中的比较返回 true,因为 pq 的元素比 pq2 多。如果两个队列具有相同数量的元素,则将成对比较元素。

示例 17.2。使用 boost::heap::binomial_heap

#include <boost/heap/binomial_heap.hpp>
#include <iostream>
using namespace boost::heap;
int main()
{
  binomial_heap<int> bh;
  bh.push(2);
  bh.push(3);
  bh.push(1);
  binomial_heap<int> bh2;
  bh2.push(4);
  bh.merge(bh2);
  for (auto it = bh.ordered_begin(); it != bh.ordered_end(); ++it)
    std::cout << *it << '\n';
  std::cout << std::boolalpha << bh2.empty() << '\n';
}

Example17.2

示例 17.1 使用了 boost::heap::priority_queue 类,该类在 boost/heap/priority_queue.hpp 中定义。一般来说,这个类的行为类似于 std::priority_queue,除了它允许你迭代元素。迭代中返回的元素顺序是随机的。

boost::heap::priority_queue 类型的对象可以相互比较。示例 17.1 中的比较返回 true,因为 pq 的元素比 pq2 多。如果两个队列具有相同数量的元素,则将成对比较元素。

示例 17.2。使用 boost::heap::binomial_heap

示例 17.2 引入了类 boost::heap::binomial_heap。除了允许您按优先级顺序迭代元素之外,它还允许您合并优先级队列。一个队列中的元素可以添加到另一个队列。

示例在队列 bh 上调用 merge()。队列 bh2 作为参数传递。对 merge() 的调用将数字 4 从 bh2 移动到 bh。调用后,bh 包含四个数字,bh2 为空。

for 循环在 bh 上调用 ordered_begin() 和 ordered_end()。 ordered_begin() 返回一个从高优先级元素迭代到低优先级元素的迭代器。因此,示例 17.2 将数字 4、3、2 和 1 写入标准输出。

示例 17.3。更改 boost::heap::binomial_heap 中的元素

#include <boost/heap/binomial_heap.hpp>
#include <iostream>
using namespace boost::heap;
int main()
{
  binomial_heap<int> bh;
  auto handle = bh.push(2);
  bh.push(3);
  bh.push(1);
  bh.update(handle, 4);
  std::cout << bh.top() << '\n';
}

boost::heap::binomial_heap 允许您在元素添加到队列后更改它们。示例 17.3 保存了 push() 返回的句柄,从而可以访问存储在 bh 中的数字 2。

update() 是 boost::heap::binomial_heap 的成员函数,可以调用它来更改元素。示例 17.3 调用成员函数将 2 替换为 4。然后,使用 top() 获取具有最高优先级的元素,现在为 4。

除了 update() 之外,boost::heap::binomial_heap 还提供了其他成员函数来更改元素。如果您事先知道更改是否会导致更高或更低的优先级,则可以调用成员函数 increase() 或 decrease()。在示例 17.3 中,对 update() 的调用可以替换为对 increase() 的调用,因为该数字从 2 增加到 4。

Boost.Heap 提供了额外的优先级队列,其成员函数的主要区别在于它们的运行时复杂度。例如,如果您希望成员函数 push() 具有恒定的运行时复杂度,则可以使用类 boost::heap::fibonacci_heap。 Boost.Heap 上的文档提供了一个表格,其中概述了各种类和函数的运行时复杂性。

到此这篇关于C++ Boost Heap使用实例详解的文章就介绍到这了,更多相关C++ Boost Heap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++中关于std::string的compare陷阱示例详解

    C/C++中关于std::string的compare陷阱示例详解

    这篇文章主要给大家介绍了关于C/C++中关于std::string的compare陷阱的相关资料,文中先对C/C++中的std::string进行了简单的介绍,通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • C语言模式实现C++继承和多态的实例代码

    C语言模式实现C++继承和多态的实例代码

    本篇文章主要介绍了C语言模式实现C++继承和多态的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 基于C语言实现五子棋游戏完整实例代码

    基于C语言实现五子棋游戏完整实例代码

    这篇文章主要介绍了基于C语言实现五子棋游戏完整实例代码,相信对于学习游戏开发的朋友会有一定的帮助与借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C++ continue和break语句

    C++ continue和break语句

    这篇文章主要介绍了C++ continue和break语句,文章围绕continue和break语句的相关资料展开详细内容,需要的朋友可以参考一下,希望对大家有所帮助
    2021-11-11
  • C语言编程中生成随机数的入门教程

    C语言编程中生成随机数的入门教程

    这篇文章主要介绍了C语言编程中生成随机数的入门教程,包括利用rand()函数来编写随机数生成器的示例,要的朋友可以参考下
    2015-12-12
  • C语言 数组指针详解及示例代码

    C语言 数组指针详解及示例代码

    本文主要介绍C语言 数组指针,这里整理了相关资料并附示例待会及实现结果,帮助大家学习C语言中指针的知识,有需要学习此部分内容的朋友可以参考下
    2016-08-08
  • 详解C语言处理算经中著名问题百钱百鸡

    详解C语言处理算经中著名问题百钱百鸡

    古代的很多数学问题都可以用现代的编程语言去尝试解决,就如本篇,将会带你通过C语言来解决算经中百钱百鸡问题,感兴趣的朋友来看看吧
    2022-02-02
  • Matlab实现同步子图视角的方法详解

    Matlab实现同步子图视角的方法详解

    这篇文章主要和大家分享三个可以Matlab中更简便实现同步子图视角的技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2022-06-06
  • C++中的函数汇总

    C++中的函数汇总

    这篇文章主要介绍了 C++中的函数汇总的相关资料,需要的朋友可以参考下
    2017-08-08
  • 浅析结束程序函数exit, _exit,atexit的区别

    浅析结束程序函数exit, _exit,atexit的区别

    在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用
    2013-09-09

最新评论