2011-12-13 22 views
20

セットから最後のメンバーを削除するにはどうすればよいですか?例えばstd :: setの最終メンバーを消去する

set<int> setInt; 
setInt.insert(1); 
setInt.insert(4); 
setInt.insert(3); 
setInt.insert(2); 

どのように私はsetIntから4を削除することができますか?私のような何か試してみました:

setInt.erase(setInt.rbegin()); 

を私はエラーを受け取りました。ところで

+0

私は忘れてしまったセットはランダムアクセスイテレータを持っていません。 – AJG85

答えて

17
if (!setInt.empty()) { 
    std::set<int>::iterator it = setInt.end(); 
    --it; 
    setInt.erase(it); 
} 

あなたは(任意の順番でセットに物事を追加し、先頭の要素を削除する)このをたくさんやっている場合、あなたはまた、それがあなたに合うかどうか、std::priority_queueを見て取ることができます使用法。

あなたはセットが空のケースを処理する方法を決定することができますC++ 11

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

+0

ああ、私は 'if'が何らかの理由で' for'ループであると思っていました... –

30

1

最後の4の代わりに4を削除する場合は、findメソッドを使用する必要があります。 ユースケースによっては、最後のものではない可能性があります。

std::set<int>::iterator it = setInt.find(4); 
if(it != setInt.end()) { 
    setInt.erase(it); 
} 

あなたは最後の要素の使用を削除したい場合は:。私はもしわからなかったが

if (!setInt.empty()) { 
    setInt.erase(--setInt.rbegin().base()); 
    // line above is equal to 
    // setInt.erase(--setInt.end()); 
} 

を - *エンド(); O.Kです。私はいくつかの読書をしました。 したがって、rbegin()。base()はend()と同じ結果になります。 そして、どちらもうまくいくはずです。

+0

setInt。[rend()] 'setInt.erase(std :: prev(setInt.end())) ](http://www.cplusplus.com/reference/stl/set/rend/)は、setInt.begin()の前を指すイテレータを返します。したがって、セットの最後とは関係ありません。 – wigy

+0

あなたは私が書くことを意図しています。 :-(私はこれを修正する – Totonga

+1

あなたの提案は、私たちがすでに知っているように、質問にあるものとどう違うのですか? – bitmask

0

セットが空であるかどうかを確認します。そうでない場合は、最後の要素を取得し、イテレータとして設定し、そのイテレータを減らして最後の要素を消去します。

if (!setInt.empty()) 
{ 
    std::set<int>::iterator it = setInt.end(); 
    --it; 
    if(it != setInt.end()) { 
    setInt.erase(it); 
    } 
} 
5

私は適切な型を持っているrbeginに別の名前使用して提案したい:あなたはsetIntが空でないことを確認と仮定すると、

setInt.erase(--setInt.end()); 

を!

Btw。これは、テンポラリ(タイプstd::set<int>::iterator)の変数減算演算子を呼び出すことができるためです。このテンポラリは、消去機能に渡されます。

+0

狡猾。それはクラス型でなければならないので、一時変数は減分可能でなければなりません。 –

+0

@SteveJessop:彼らは:) – bitmask

関連する問題