11

次を使用して、マルチセットの最後の要素を消去しようとしています:

minheap.erase(minheap.rbegin());

コンパイルされず、4 ~ 5 個のエラーが発生します。

C++ マルチセットでは.end()、最後の要素ではなく、最後の要素の次を指すことに注意してください。

何か案は?

編集:

これが異なる数値を提供しているのはなぜですか?

multiset <int>::reverse_iterator it1 = minheap.rbegin();
m1=*(++it1);

multiset <int>::iterator it2 = minheap.end();
m2=*(--it2);
マルチセット `m1 is 1` と `m2 is 2` にいくつかのデータが追加されています。なぜそれらは同じではないのですか?
4

1 に答える 1

23

消去関数は、引数として通常のイテレータを取る必要があります。そのようなイテレータを取得するには、呼び出してみることができます

minheap.erase(std::prev(minheap.end()));

これは end() を呼び出して反復子を最後まで取得し、新しい C++11 prev 関数を使用して 1 ステップ戻します。C++11 をサポートしていない場合は、代わりに次のように記述できます。

minheap.erase(--minheap.end());

または、マルチマップを最小ヒープとして使用しようとしているように見えるので、代わりにpriority_queueまたはpush_heapやpop_heapなどのヒープアルゴリズムを使用することを検討しましたか?

編集: フォローアップの質問に答えるために、ここで 2 つの異なる値を取得している理由は、論理的には、rbegin が multimap の最後の要素を指し、その 1 ステップ前ではなく、end が 1 つ後ろを指しているからです。end を 1 ステップ戻すと、rbegin と同じ要素が参照されるため、rbegin を 1 ステップ進めると、最後の要素の 1 ステップ前の要素を指すことになります。

お役に立てれば!

于 2012-01-24T19:16:31.673 に答える