其他分享
首页 > 其他分享> > c-如何更改std :: priority_queue top()的值?

c-如何更改std :: priority_queue top()的值?

作者:互联网

当使用std :: priority_queue top()时,它返回一个常量引用.那么有没有办法我既可以利用std :: priority_queue并更改top()的值呢?

解决方法:

首先,我必须达到clarify关于关联容器的一点,但是现在我终于可以写出我对这个问题的答案了.

@Xymostech的注释中已经概述了修改作为关联容器一部分的对象的键时的基本策略.您复制/检索元素,将其从容器中删除,对其进行修改,最后将其重新插入到容器中.

有关使用指针的评论中的问题和想法表明复制对象可能很昂贵,因此您还应该知道可以使用指针来提高效率,但是仍然需要从上面应用基本方案.

考虑:

template< typename T >
struct deref_less
{
  typedef std::shared_ptr<T> P;
  bool operator()( const P& lhs, const P& rhs ) { return *lhs < *rhs; }
};

std::priority_queue< std::shared_ptr< MyClass >,
                     std::vector< MyClass >,
                     deref_less< MyClass > > pq;

现在,如果要修改MyClass的对象,则仍然需要

auto e = pq.top();
pq.pop();
e->modify( 42 );
pq.push(e);

但是如果MyClass的复制成本很高,则使用std :: shared_ptr和自定义比较器可能有助于使其更快.

标签:c,c11,const,stl,priority-queue
来源: https://codeday.me/bug/20191012/1898051.html