【问题标题】:how to change the value of std::priority_queue top()?如何更改 std::priority_queue top() 的值?
【发布时间】:2013-03-29 04:57:03
【问题描述】:

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

【问题讨论】:

  • 我认为它是一个 const 引用的原因是,如果你可以改变它,你可能会破坏优先级队列的排序。例如,您不能.pop 值,修改它,然后.push 重新打开它吗?
  • @Xymotech 但是弹出它时我没有得到对该值的引用......
  • 哦。那么,从.top().pop().push 复制一份?
  • @Xymotech ......我怎么没想到......你认为我应该用指针代替吗?
  • 不,我认为复制和重新推送是一种很好的方法。

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


【解决方案1】:

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

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

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

考虑:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多