首页IT科技c++ move semantics(C++ move()函数及priority_queue队列使用记录)

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

时间2025-05-05 15:05:46分类IT科技浏览3681
导读:最近刷leetcode题,使用了move( 函数及优先队列(堆)priority_queue数据结构,记录一下!...

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

1.move函数

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

右值引用

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

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

运行结果:

这时候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)                 。

声明:本站所有文章      ,如无特殊说明或标注                ,均为本站原创发布     。任何个人或组织           ,在未征得本站同意时      ,禁止复制                、盗用      、采集      、发布本站内容到任何网站                、书籍等各类媒体平台           。如若本站内容侵犯了原著者的合法权益                 ,可联系我们进行处理                 。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python中字典怎么遍历(Python字典遍历的三种情况)