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

时间:2013-03-29 04:57:03

标签: c++ c++11 stl const priority-queue

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

1 个答案:

答案 0 :(得分:1)

首先我必须clarify关于关联容器的一点,但现在我终于能够写出我对这个问题的答案了。

@Xymostech的评论中已经概述了修改属于关联容器的对象的键的基本策略。您复制/检索元素,将其从容器中删除,修改它,最后将其重新插入容器。

你的问题以及关于使用指针的评论的想法表明复制对象可能很昂贵,所以你也应该知道可以使用指针来提高效率,但你会< em>仍需要应用上面的基本方案。

考虑:

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和自定义比较器可能有助于加快速度。