C++:如何正确地遍历指向的向量

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

假设我有一个向量,v

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

在以指向 v 的指针作为参数的函数中循环遍历 v 的正确方法是什么?我可以看到两种方法,要么使用 (*) 取消引用向量,要么使用 .at() 成员:

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

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

两者有什么区别吗?还是有另一种更好的方法来做到这一点?在我看来,第二个会在每次迭代时取消引用完整的向量对象以获得单个值,这似乎有点过头了,当然只在你想要的内存位置取消引用值会更好?

在这两种情况下都将取消引用指针。但是 at 执行范围检查并在失败时抛出异常,因此第二种方法会更慢。

正确的方法可能是这样的:

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

由于您的代码假定指针始终有效,因此没有理由使用它代替引用。 See Cpp Core Guidelines.