4

std::priority_queue top() を使用すると、定数参照が返されます。std::priority_queue を利用して top() の値を変更する方法はありますか?

4

1 に答える 1

2

最初に連想コンテナに関する 1 つの点を明確にする必要がありましたが、ようやくこの質問に対する回答を書くことができました。

連想コンテナの一部であるオブジェクトのキーを変更するときの基本的な戦略は、@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、カスタム コンパレータを使用すると、高速化に役立つ場合があります。

于 2013-03-29T11:01:52.243 に答える