首页 > 编程语言 >C++ move()函数及priority_queue队列使用记录

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

时间:2023-01-10 00:23:32浏览次数:32  
标签:priority 元素 obj 容器 队列 move C++ queue

最近刷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)。

标签:priority,元素,obj,容器,队列,move,C++,queue
From: https://www.cnblogs.com/echoqiqi/p/17038927.html

相关文章

  • C++ATM取存款机模拟程序[2023-01-09]
    C++ATM取存款机模拟程序[2023-01-09]ATM取存款机模拟程序要求:设计一个程序,当输入给定的卡号和密码(初始卡号和密码为123456)时,系统能登录ATM取款机系统,用户可以按照以下......
  • C++引用【cherno课程学习】
    定义intmain(){inta=5;int*b=&a;//这个是指针int&ref=a;//这个是引用std::cin.get();}ref变量实际上不存在,只存在于源代码中,如果对......
  • C++实现顺序栈相关操作代码
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0#defineOVERFLOW-2typedefintStatus;typedefintElemtype......
  • Java并发容器之PriorityBlockingQueue源码分析
    一、简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链接直达Java......
  • C++实现链队列相关操作代码
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintStatus;typedefintElemtype;typedefstructQno......
  • C++成员初始化表达式列表的使用
    在类的构造函数中,首选使用成员初始化表达式列表去给类的对象赋值,这个比构造函数体种赋值速度更快,开销小解答如下:赋值初始化,通过在函数体内进行赋值初始化;列表初始化,在......
  • 软件开发入门教程网之C++ 引用
    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。​​C++引用vs指针​​引用很容易......
  • ​​软件开发入门教程网之​​C++ 信号处理
     信号是由操作系统传给进程的中断,会提早终止一个程序。在UNIX、LINUX、MacOSX或Windows系统上,可以通过按Ctrl+C产生中断。有些信号不能被程序捕获,但是下表所列......
  • c++ opencv mfc基础入门
    参考文献:  计算机视觉面试c++ 字符串的按词倒序 C++;MFC点击弹出自定义对话框VC++基于MFC更新编辑框中的内容 MFC界面编程基础(11):静态文本框、命令按钮和编辑......
  • 关于for循环中remove方法使用问题
    //直接forEachList<String>k=newArrayList<>();k.add("1");k.add("2");k.add("3");k.add("4");for(Stringd:k){k.remove(d);}//for循环List<String>k=......