Generally speaking is it a good idea to cache an end iterator (specifically STL containers) for efficiency and speed purposes? such as in the following bit of code:
std::vector<int> vint;
const std::vector<int>::const_iterator end = vint.end();
std::vector<int>::iterator it = vint.begin();
while (it != end)
{
....
++it;
}
Under what conditions would the end value be invalidated? would erasing from the container cause end to be invalidated in all STL containers or just some?
In the simple case of a
vector, theenditerator will change when you add or remove elements from the container; though, it’s usually safest to assume that if you mutate the container while iterating over it, all iterators to it become invalid. Iterators may be implemented differently in any given STL implementation.With regard to caching the
enditerator — it’s certainly valid to cache it, but to find out if it is actually faster in your case, the best bet is for you to profile your code and see. While retrieving theenditerator from avectoris likely a fast implementation with a recent STL library and compiler, I have worked on past projects where caching theenditerator gave us a significant speed boost. (This was on the PlayStation 2, so do take with a grain of salt.)