storluffarn
storluffarn

Reputation: 141

C++: How to properly go through vector pointed to

Say that I have a vector, v,

vector <int> v = {0,1,2,...n};

What is the proper way to loop through v in a function taking a pointer to v as an argument? I can see two ways, either dereference the vector using (*) or using the .at() member:

void foo(vector <int>* v)
{
    for (auto& el : (*v))
        bar(el);
}

or

void foo(vector <int>* v)
{
    for (int k = 0; k < n; k++)
        bar(v->at(k));
}

Is there any difference between the two? Or is there another, superior, way to do it? It seems to me the second one would dereference the full vector object each iteration to get a single value, which seems like a bit of an over-kill, surely it would be better to only dereference the value at the memory location you want?

Upvotes: 1

Views: 80

Answers (1)

user7860670
user7860670

Reputation: 37600

Pointer will be dereferenced in both cases. However at performs range checking and throws an exception if it fails so second approach will be slower.

A proper approach may look like this:

void foo(::std::vector<int> & v)
{
    for(auto & el: v)
    {
        bar(el);
    }
}

Since your code assumes that pointer is always valid there is not a single reason to use it instead of a reference. See Cpp Core Guidelines.

Upvotes: 1

Related Questions