Unfortunately, before C++11, it was a design decision not to return the following position, because if not needed, it costs unnecessary time.

Calling erase() for the element to which you are referring with pos invalidates pos as an iterator of coll. Thus, if you use pos after removing its element without any reinitialization, all bets are off. In fact, calling ++pos results in undefined behavior.

Since C++11, a solution is easy because erase() always returns the value of the following element.

[TC++PL4]An iterator to an element of an associative container (e.g., a map) is only invalidated if the element to which it points is removed from the container (erase()d; §31.3.7). To contrast, an iterator to an element of a sequence container (e.g., a vector) is inv alidated if the elements are relocated (e.g.,by a resize(), reserve(), or push_back()) or if the element to which it points is moved within the container (e.g., by an erase() or insert() of an element with a lower index).
It is tempting to assume that reserve() improves performance, but the standard growth strategies for vector (§31.4.1.1) are so effective that performance is rarely a good reason to use reserve().Instead, see reserve() as a way of increasing the predictability of performance and for avoiding invalidation of iterators.