Erase the maximum item from the STL set

This is a continuation of the previous question ( STL complexity max_element ).

I want to basically pull the max element out of the set, but I have problems.

Here is roughly my code:

set<Object> objectSet;

Object pop_max_element() {
    Object obj = *objectSet.rbegin();
    set<Object>::iterator i = objectSet.end()--; //this seems terrible
    objectSet.erase(i); //*** glibc detected *** free(): invalid pointer
    return obj;
}

I tried objectSet.erase(objectSet.rbegin());before, but the compiler complained that the corresponding function does not exist (I assume that it does not like reverse_iterator). I know that there is no check for an empty set, but it does not work when objectSet.size () → 0.

+5
source share
3 answers

, . - , end. , , , . end i, , .

set<Object>::iterator i = objectSet.end();
--i;
Object obj = *i;
objectSet.erase(i);
return obj;
+9

:

set<Object> objectSet;

Object pop_max_element() {
    Object obj = *objectSet.rbegin();
    set<Object>::iterator i = --objectSet.end(); // NOTE: Predecrement; not postdecrement.
    objectSet.erase(i); //*** glibc detected *** free(): invalid pointer
    return obj;
}
+5

set<Object>::iterator i = objectSet.end()--;

" end() i, , ". , , set<Object>::iterator i = objectSet.end();, , , end(), . - :

assert(!objectSet.empty()); // check there is something before end
set<Object>::iterator i = objectSet.end();
--i;
objectSet.erase(i);

, .back() .

In addition, reverse iterators have a member base()to convert to a regular iterator, and I think you can only erase normal iterators - give it a try objectSet.erase(objectSet.rbegin().base()).

+5
source

All Articles