C++ iterator to last element of a set

30,670

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(); 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().

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;

Share:
30,670
Abdullah Shahriar
Author by

Abdullah Shahriar

Updated on July 05, 2022

Comments

  • Abdullah Shahriar
    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(); with cout << *--a.end(); works fine.

  • NathanOliver
    NathanOliver over 7 years
    May also want to say that it is UB
  • Lev Leontev
    Lev Leontev over 4 years
    OMG! I always used (--a.end()), but now i know the best option ;)