On https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html it is recommended to write for loops like the following:
Container::iterator end = large.end();
for (Container::iterator it = large.begin(); it != end; ++it) {
//...;
}
instead of
for (Container::iterator it = large.begin(); it != large.end(); ++it) {
//...;
}
Since I have rarely seen this style in any code, I would like to know whether the consecutive call of end() really adds a noticeable run-time overhead for large loops over stl containers or whether compilers already optimize such cases.
Edit: As many of to very good comments pointed out: This question is only valid if the code inside the loop does not modify the end iterator. Otherwise of course the repeated call of end is mandatory.
The three types of containers found in the STL are sequential, associative and unordered.
The major two operators used in STL arrays are equality comparison (==) and less-than comparison (<) between two array containers.
In C++, there are generally 3 kinds of STL containers: Sequential Containers. Associative Containers. Unordered Associative Containers.
The C++11 standard (§ 23.2.1) mandates that end
has O(1) complexity, so a conforming implementation would have the same performance characteristics for both versions.
That said, unless the compiler can prove that the return value of end
will never change then pulling end
out of the loop might be faster by some constant quantity (as Steve Jessop comments, there are lots of variables that can influence whether this is true or not).
Still, even if in one particular case there is absolutely no performance difference, pulling such tests out of the loop is a good habit to get into. An even better habit to get into is to utilize standard algorithms as @pmr says, which sidesteps the issue entirely.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With