C++ iterator to last element of a set
Solution 1
Just use *a.rbegin()
which points to the last element in the set
Solution 2
*a.end()
Undefined behaviour. In C++ iterator terminology, "end" does not mean the same thing as "last element".
Replacing
cout << *a.end();
withcout << *--a.end();
works fine.
Consider a reverse iterator: *a.rbegin()
.
Keep in mind that both begin()
and rbegin()
only return dereferencable iterators if the container is not empty. For empty containers, begin() == end()
and rbegin() == rend()
.
Solution 3
Why is it always printing "3" instead of the greatest element in the set?
Because a.end()
is one past the end of your vector. It doesn't hold any valid data, it's a marker for the end of your vector. As in:
for(auto i = a.begin(); i != a.end(); ++i)
// do stuff with i
EDIT: (thanks to Nathan) dereferencing a.end()
yields the dreaded undefined behaviour. Anything could have happened: get a 3
, get the last element in the set, could even have canceled X-mas!!!
Solution 4
To find the last element of a set what we can do is use an iterator that points to last of the of the set and then decrement the iterator to reach the last element as set.end() represent the iterator that points just outside the end of set.
auto it = s.end();
it--;
cout<<(*it)<<endl;
Abdullah Shahriar
Updated on July 05, 2022Comments
-
Abdullah Shahriar almost 2 years
I have the following code in C++
#include <iostream> #include <set> using namespace std; int main() { set<int> a; int n; for(int i=0;i<3;i++){ cin>>n; a.insert(n); } cout << *a.end(); return 0; }
Why is it always printing "3" instead of the greatest element in the set? Replacing
cout << *a.end();
withcout << *--a.end();
works fine. -
NathanOliver over 7 yearsMay also want to say that it is UB
-
Lev Leontev over 4 yearsOMG! I always used (--a.end()), but now i know the best option ;)