Abdullah Shahriar
Abdullah Shahriar

Reputation: 375

C++ iterator to last element of a set

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

Answers (5)

Rachit Shah
Rachit Shah

Reputation: 23

For set<int>s

You can also use *prev(s.end())

Upvotes: 2

parad0x
parad0x

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

user10517710
user10517710

Reputation: 611

Just use *a.rbegin() which points to the last element in the set

Upvotes: 60

Christian Hackl
Christian Hackl

Reputation: 27528

*a.end()

Undefined behaviour. In C++ iterator terminology, "end" does not mean the same thing as "last element".

Replacing cout << *a.end(); with cout << *--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

Paul Evans
Paul Evans

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

Related Questions