iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ move()函数及priority_queue队列使用记录
  • 393
分享到

C++ move()函数及priority_queue队列使用记录

C++ move()函数C++ priority_queue队列 2023-01-10 09:01:25 393人浏览 八月长安
摘要

目录简介1.move函数右值引用 2.priority_queue队列简介 priority_queue 是一个拥有权值观念的 queue,它允许加入新的元素、移除旧的元素

简介

priority_queue 是一个拥有权值观念的 queue,它允许加入新的元素、移除旧的元素、查看 priority_queue 中权值之最的元素等功能。priority_queue 只允许在底端加入元素,并从顶端取出元素,除此之外没有其它存取元素的途径。

priority_queue 提供常数时间的最大元素(默认)查找,对数代价的插入与释放。可为用户提供的 compare 更改顺序,例如,用 std::greater<T> 将导致最小元素作为 top() 出现。用 priority_queue 工作类似管理某些随机访问容器中的堆,优势是不可能突然把堆非法化。

虽然priority_queue 的名字中带有 queue,但是其底层的逻辑结构是堆。缺省情况下 priority_queue 利用一个大顶堆完成(底层存储结构是 vector)。堆结构能满足 priority_queue 所需要的”按照权值高低自动排序”的特性。这里要弄清楚的一点是:priority_queue 底层缺省使用 vector存 储数据,这是它的存储结构。而在逻辑上,它将序列视为一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的关系,在当前无序区间中选择关键字最大(或最小)的元素。

最近刷LeetCode题,使用了move()函数及优先队列(堆)priority_queue数据结构,记录一下!

1.move函数

move(obj)函数的功能是把obj当做右值处理,可以应用在对象的移动上。

右值引用

为了支持移动操作,新标准引入了一种新的引入类型——右值引用,所谓右值引用就是必须绑定到右值的引用。通过&&而不是&来获得右值引用。

注意,如果仅仅是定义右值引用,那么obj本身不会被移走,在作为参数时会发生obj被移走:如下:

string str = "test";
    string&& r = move(str);
    cout<< r <<endl;
    cout<< str <<endl;
    string t(r);
    cout<< t <<endl;
    cout<< str <<endl;

运行结果:

 这时候r和str都可以使用。

但是,若左值不使用右值引用,move则会销毁变量obj,之后都不能使用它,如:

string str = "test";
    string&& r = move(str);
    cout<< r <<endl;
    cout<< str <<endl;
    string t(move(r));
    cout<< t <<endl;
    cout<< str <<endl;

结果为:

 2.priority_queue队列

优先队列是一种容器适配器,采用了这样的数据结构,保证了第一个元素总是整个优先队列中最大的(或最小的)元素。

优先队列默认使用vector作为底层存储数据的容器,在vector上使用了堆算法将vector中的元素构造成堆的结构,所以其实我们就可以把它当作堆,凡是需要用堆的位置,都可以考虑优先队列。

STL 中,priority_queue 容器适配器的定义如下:

template <typename T,
        typename Container=std::vector<T>,
        typename Compare=std::less<T> >
class priority_queue{
    //......
}

priority_queue 容器适配器模板类最多可以传入 3 个参数,它们各自的含义如下:
typename T:指定存储元素的具体类型;
typename Container:指定 priority_queue 底层使用的基础容器,默认使用 vector 容器。(STL 序列式容器中只有 vector 和 deque 容器符合条件。)

typename Compare:指定容器中评定元素优先级所遵循的排序规则,默认使用std::less按照元素值从大到小进行排序,还可以使用std::greater按照元素值从小到大排序,但更多情况下是使用自定义的排序规则。

使用优先队列创建大、小堆

//大根堆
priority_queue<int, std::deque<int>, std::greater<int>> values;
//默认是大根堆
priority_queue<int>values;
//小根堆
priority_queue<int, std::vector<int>, std::less<int>>values;

作为队列有其队列的成员函数

成员函数功能
empty()如果 priority_queue 为空的话,返回 true;反之,返回 false。
size()返回 priority_queue 中存储元素的个数。
top()返回 priority_queue 中第一个元素的引用形式
push(const T& obj)根据既定的排序规则,将元素 obj 的副本存储到 priority_queue 中适当的位置。
push(T&& obj)根据既定的排序规则,将元素 obj 移动存储到 priority_queue 中适当的位置。
emplace(Args&&… args)Args&&… args 表示构造一个存储类型的元素所需要的数据(对于类对象来说,可能需要多个数据构造出一个对象)。此函数的功能是根据既定的排序规则,在容器适配器适当的位置直接生成该新元素。
swap(priority_queue& other)将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同
pop()移除 priority_queue 容器适配器中第一个元素。

使用优先队列,可以维护好最大/最小值;以及一些其他规则的一些比较(这个需要进行重载,目前还没遇到)。

插入堆的时间复杂度最大为O(nlogn)。

到此这篇关于c++ move()函数及priority_queue队列使用记录的文章就介绍到这了,更多相关C++ move()函数及priority_queue队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ move()函数及priority_queue队列使用记录

本文链接: https://www.lsjlt.com/news/177240.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ move()函数及priority_queue队列使用记录
    目录简介1.move函数右值引用 2.priority_queue队列简介 priority_queue 是一个拥有权值观念的 queue,它允许加入新的元素、移除旧的元素...
    99+
    2023-01-10
    C++ move()函数 C++ priority_queue队列
  • 深入了解C++优先队列(priority_queue)的使用方法
    目录优先队列的基本概念优先队列的使用方法优先队列元素的排序规则元素的自定义排序优先队列的时间复杂度总结优先队列的基本概念 在计算机科学中,优先队列是一种抽象数据类型,它与队列相似,但...
    99+
    2023-05-18
    C++优先队列 C++队列
  • C++深入刨析优先级队列priority_queue的使用
    目录一、priority_queue的介绍二、priority_queue的使用三、priority_queue的模拟实现四、容器适配器4.1、什么是适配器4.2、适配模式4.3、S...
    99+
    2022-11-13
    C++ 优先级队列 priority_queue C++ priority_queue
  • c++11中std::move函数的使用
    C++11在运行期有所增强,通过增加核心的右值引用机制来改善临时对象导致的效率低下的问题。C++临时对象引入了多余的构造、析构及其内部资源的申请释放函数调用,导致程序运行时性能受损,...
    99+
    2024-04-02
  • 如何进行c++11中std::move函数的使用
    这篇文章给大家介绍如何进行c++11中std::move函数的使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++11在运行期有所增强,通过增加核心的右值引用机制来改善临时对象导致的效率低下的问题。C++临时对象引...
    99+
    2023-06-29
  • python中的queue队列类型及函数用法
    目录python queue队列类型及函数1.队列的种类2.队列函数python 队列类及其方法1.Python的队列类型2.队列对象(适用Queue、LifoQueue和Prior...
    99+
    2024-04-02
  • jQuery中队列queue()函数怎么使用
    这篇“jQuery中队列queue()函数怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jQuery中队列queue...
    99+
    2023-07-04
  • C语言中队列的结构和函数接口的使用示例
    目录一、队列的结构二、队列的函数接口1. 初始化和销毁2. 入队和出队3. 访问队头和队尾元素4. 判空和元素个数一、队列的结构 队列:一种操作受限的线性表,只允许在线性表的一端进行...
    99+
    2023-02-14
    C语言队列结构 C语言函数接口
  • 如何使用队列系统优化 PHP 函数并发性?
    通过使用队列系统,可以提升 php 函数的并发性,提高处理速度并降低系统负载。此外,队列系统还提供了可伸缩性、可靠性以及故障处理机制,确保任务的成功执行。 如何使用队列系统优化 PHP...
    99+
    2024-04-24
    队列系统 php函数并发
  • 如何使用C#多线程处理多个队列数据
    这篇文章主要介绍如何使用C#多线程处理多个队列数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬...
    99+
    2023-06-15
  • C# 使用Aspose.Cells 导出Excel的步骤及问题记录
    今天在工作中碰到同事用了一种新型的方式导入excel,在此做个学习记录。 Aspose.Cells简介:Aspose.Cells是一款功能强大的Excel文档处理和转换控件,开发人员...
    99+
    2024-04-02
  • C++中fork函数的使用及原理
    目录fork函数的基本概况fork函数做的工作fork函数之后fork函数的基本概况 fork() 函数调用成功之后,会有两个返回值。当前进程,也就是父进程返回子进程的 pid,子进...
    99+
    2023-05-19
    C++ fork函数 C++ fork
  • C#静态函数及变量怎么使用
    本篇内容介绍了“C#静态函数及变量怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!学习C#静态方法之前我们首先来看看C#静态函数及变量...
    99+
    2023-06-17
  • 如何在 Bash 中使用 Go 函数来记录日志?
    Bash 和 Go 是两种非常流行的编程语言,它们都有其独特的优点和用途。在实际的项目中,我们经常需要记录日志以便于调试和追踪问题。那么如何在 Bash 中使用 Go 函数来记录日志呢?本文将为您详细介绍。 首先,我们需要了解一下 Bash...
    99+
    2023-06-30
    函数 bash 日志
  • 怎么使用c#构造函数初始化列表
    在C#中,可以使用构造函数初始化列表来初始化类的成员变量。构造函数初始化列表是在构造函数的参数列表后面使用冒号来定义的。下面是一个示...
    99+
    2023-09-28
    c#
  • C++文件函数有哪些及怎么使用
    C++中的文件操作函数主要包括以下几个:1. std::ifstream:用于从文件中读取数据。使用方法示例:```cpp#incl...
    99+
    2023-08-18
    C++
  • Go 日志记录:如何使用缓存优化函数调用?
    在开发过程中,我们经常需要记录日志以便于追踪和调试。Go 语言提供了标准库 log,可以方便地实现日志记录功能。但是,当我们需要频繁地记录相同的日志信息时,过多的日志记录会对性能产生影响。在这种情况下,我们可以使用缓存优化函数调用,以减少...
    99+
    2023-10-17
    日志 函数 缓存
  • 如何在 PHP 中使用重定向函数记录日志?
    在 PHP 中,重定向(redirect)是一个非常常见的操作,它可以将用户从当前页面跳转到另一个页面。在一些场景下,我们需要对用户的操作进行记录,例如用户登录、注册、提交表单等等。这时候,我们可以使用重定向函数来实现记录日志的功能。 本文...
    99+
    2023-08-15
    重定向 日志 函数
  • 如何使用php函数来优化日志记录性能?
    在开发Web应用程序时,日志记录是非常重要的一项功能。通过记录系统运行时的日志信息,我们可以更好地了解应用程序的运行状态,诊断问题,并进行性能优化。然而,不恰当的日志记录方式可能会带来性能瓶颈,影响应用程序的执行效率。本文将介绍如何使用PH...
    99+
    2023-10-21
    优化 日志记录 PHP函数
  • C++中成员函数和友元函数的使用及区别详解
    为什么使用成员函数和友元函数 这个问题至关重要,直接影响着后面的理解: 程序数据: 数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作