標準コンテナとコンテナ アダプタには、値のセマンティクスがあります。要素をキューにプッシュすると、コピーが作成されます。キューからオブジェクトを削除すると、そのオブジェクトは破棄されます。
top()
が non- への参照を返したとしてもconst
、キューから要素を削除するとすぐにその参照がぶら下がり、逆参照すると未定義の動作が発生します。
これは、std::priority_queue
への参照を返し、内部の順序付けを (意図的にまたは意図せずに) 混乱させないようにします。これは、やconst
などの連想コンテナーのキーが である理由とほとんど同じです。std::map
std::set
const
代わりにできることは、によって返された値のコピーtop()
を作成し、そのコピーを変更し、元の値を削除して、コピーをキューにプッシュすることです。
SomeClass obj = pQueue.top();
pQueue.pop();
obj.setMember(42);
pQueue.push(std::move(obj)); // You can move obj into the queue if you no more need it
一方、参照セマンティクスが必要な場合は、ポインターをキューにプッシュし (ユース ケースによってはスマート ポインターの可能性があります)、オブジェクトのプロパティに基づいてポインターを並べ替える適切なカスタム順序付け基準を提供する必要があります。彼らは指しています。
この場合、実行時にこれらのプロパティを変更して順序が異なるようにしないように注意してください。これは「コンテナの内部順序をいじる」と見なされ、未定義の動作が発生します。