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

 更新时间:2023年01月10日 08:41:42   作者:ECHO-422  
move(obj)函数的功能是把obj当做右值处理,可以应用在对象的移动上,这篇文章主要介绍了C++ move()函数及priority_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队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ list常用接口和模拟实现实例代码

    C++ list常用接口和模拟实现实例代码

    C++中list容器底层实现是使用带头双向循环链表的结构,通过指针指向前一个和后一个节点,它也具有双向链表的优缺点,下面给大家介绍C++ list常用接口和模拟实现代码,感兴趣的朋友一起看看吧
    2025-04-04
  • C语言基础野指针与空指针示例分析

    C语言基础野指针与空指针示例分析

    全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持
    2021-11-11
  • C++开发的Redis数据导入工具优化

    C++开发的Redis数据导入工具优化

    这篇文章主要介绍了C++开发的Redis数据导入工具优化方法的相关资料,需要的朋友可以参考下
    2015-07-07
  • C语言中fgets和fscanf区别详解

    C语言中fgets和fscanf区别详解

    这篇文章主要介绍了C语言中fgets和fscanf区别详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • 剑指offer之C语言不修改数组找出重复的数字

    剑指offer之C语言不修改数组找出重复的数字

    今天小编就为大家分享一篇关于剑指offer之C语言不修改数组找出重复的数字,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言中求解图形的问题

    C语言中求解图形的问题

    这篇文章主要介绍了C语言中求解图形的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++命名空间namespace的介绍与使用

    C++命名空间namespace的介绍与使用

    今天小编就为大家分享一篇关于C++命名空间namespace的介绍与使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++ 创建桌面快捷方式 开始菜单的实现代码

    C++ 创建桌面快捷方式 开始菜单的实现代码

    这篇文章介绍了C++ 创建桌面快捷方式,开始菜单的实现代码,需要的朋友可以参考一下
    2013-06-06
  • c语言程序设计文件操作方法示例(CreateFile和fopen)

    c语言程序设计文件操作方法示例(CreateFile和fopen)

    c主要的文件操作函数有:CreateFile,CloseHandle,ReadFile,WriteFile,SetFilePointer,GetFileSize。其中的读写操作是以字符为单位,获得文件大小也是以字符为单位。
    2013-12-12
  • C++中的HTTP协议问题

    C++中的HTTP协议问题

    这篇文章主要介绍了C++中的HTTP协议问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论