Reputation: 375
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();
with cout << *--a.end();
works fine.
Upvotes: 18
Views: 64460
Reputation: 115
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;
Upvotes: 6
Reputation: 611
Just use *a.rbegin()
which points to the last element in the set
Upvotes: 60
Reputation: 27528
*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()
.
Upvotes: 19
Reputation: 27567
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!!!
Upvotes: 9