Search code examples
c++performancestlvectoriterator

What's faster, iterating an STL vector with vector::iterator or with at()?


In terms of performance, what would work faster? Is there a difference? Is it platform dependent?

//1. Using vector<string>::iterator:
vector<string> vs = GetVector();

for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it)
{
   *it = "Am I faster?";
}

//2. Using size_t index:
for(size_t i = 0; i < vs.size(); ++i)
{
   //One option:
   vs.at(i) = "Am I faster?";
   //Another option:
   vs[i] = "Am I faster?";
}

Solution

  • Why not write a test and find out?

    Edit: My bad - I thought I was timing the optimised version but wasn't. On my machine, compiled with g++ -O2, the iterator version is slightly slower than the operator[] version, but probably not significantly so.

    #include <vector>
    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main() {
        const int BIG = 20000000;
        vector <int> v;
        for ( int i = 0; i < BIG; i++ ) {
            v.push_back( i );
        }
    
        int now = time(0);
        cout << "start" << endl;
        int n = 0;
        for(vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
            n += *it;
        }
    
        cout << time(0) - now << endl;
        now = time(0);
        for(size_t i = 0; i < v.size(); ++i) {
            n += v[i];
        }
        cout << time(0) - now << endl;
    
        return n != 0;
    }