Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can end() be a costly operation for stl containers

Tags:

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.

like image 366
Martin Avatar asked Mar 19 '12 10:03

Martin


People also ask

Which of the following are STL containers types?

The three types of containers found in the STL are sequential, associative and unordered.

Which of the following are STL operators?

The major two operators used in STL arrays are equality comparison (==) and less-than comparison (<) between two array containers.

What are the types of STL containers in C++?

In C++, there are generally 3 kinds of STL containers: Sequential Containers. Associative Containers. Unordered Associative Containers.


1 Answers

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.

like image 56
Jon Avatar answered Sep 21 '22 05:09

Jon