2017-11-11 202 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; 
} 

獲取運行問題,也試圖與自動迭代常量迭代,這不是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

謝謝,但可以你告訴我,我的代碼有什麼問題? – Arpit

+0

我告訴過你 - 你的'.base()'調用基本上返回'a.end()'。然後你在擦除一個過時的迭代器,這是未定義的行爲。 –

+0

好吧,我知道了,但如果我直接通過,「a.erase(it)」也不起作用?即使我傳遞一個需要刪除的元素的引用。 – Arpit