当使用std :: priority_queue top()时,它返回一个常量引用。那么有没有办法可以利用std :: priority_queue并更改top()的值?
答案 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
和自定义比较器可能有助于加快速度。