Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Caching the end iterator - Good idea or Bad Idea?

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?

like image 230
Hippicoder Avatar asked Jun 21 '10 11:06

Hippicoder


People also ask

What does the end iterator point to?

In something like an std::vector the ::end() iterator will point to one past the last element. You can't dereference this iterator but you can compare it to another iterator. If you compare another iterator to end() you know you've reached the end of the container.

Are iterators same as pointers?

The most obvious form of iterator is a pointer. A pointer can point to elements in an array, and can iterate through them using the increment operator (++). But, all iterators do not have similar functionality as that of pointers.

Is STL iterator a pointer?

An iterator is an object (like a pointer) that points to an element inside the container. We can use iterators to move through the contents of the container. They can be visualized as something similar to a pointer pointing to some location and we can access the content at that particular location using them.


2 Answers

If we are talking about efficiency and speed: caching the end iterator is unnecessary because of compiler optimizations and inlining.

like image 34
Sergey Podobry Avatar answered Oct 05 '22 00:10

Sergey Podobry


In the simple case of a vector, the end iterator 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 end iterator -- 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 the end iterator from a vector is likely a fast implementation with a recent STL library and compiler, I have worked on past projects where caching the end iterator gave us a significant speed boost. (This was on the PlayStation 2, so do take with a grain of salt.)

like image 107
Blair Holloway Avatar answered Oct 04 '22 23:10

Blair Holloway