2017-11-11 21 views
0

セットの最後の要素を削除して問題に直面して:`std :: set`から逆の反復子で要素を消去するには?

#include <bits/stdc++.h> 
using namespace std; 
int main() 
{ 
set < pair <int,int > > a; 
a.insert(make_pair(2,3)); 
auto it = a.rbegin(); 
a.erase(it.base()); // for deleting last element in set 
cout << a.size() << endl; 
return 0; 
} 

ランタイム問題、また自動イテレータのconstイテレータで試してみましたを取得する、それがどんな存在しworking.Isではありませんセットから要素を消去する他の方法?

編集:イテレータリファレンスに基づいて特定の要素を削除するにはどうすればよいですか? 私は好きでない場合:

auto it=a.begin(); a.erase(it); Here it = reference to the element for deletion

それは他の方法をwork.Anyていませんが、イテレータの参照に基づいて削除するには?

+0

[逆イテレータで消去を呼び出す方法](https://stackoverflow.com/questions/1830158/how-to-call-erase-with-a-reverse-iterator) –

答えて

3

他の方法でセットから要素を消去する方法はありますか?

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

あなたは私を伝えることができ、いただきました!私のコードに問題が?

itr.base()ここで、itr == a.begin()a.end()に相当します。参照先:http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base

過去のイテレータの消去は、未定義の動作です。

+0

ありがとうございますが、Can私のコードに何が問題なのか教えてください。 – Arpit

+0

私は言った - あなたの '.base()'呼び出しは基本的に 'a.end()'を返します。これで、未定義の動作である過去のイテレータを消去します。 –

+0

さて、私はそれを得ました。しかし、私が直接渡すと、 "a.erase(it)"もうまくいきませんでしたか?私は削除する必要がある要素の参照を渡しています。 – Arpit

関連する問題