C ++:如何正确地通过向量指向

时间:2017-08-21 20:13:42

标签: c++ loops pointers vector dereference

假设我有一个向量 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));
}

这两者有什么区别吗?还是有其他优越的方法吗?在我看来,第二个会在每次迭代时取消引用完整的矢量对象以获得单个值,这看起来有点过度杀戮,当然最好只取消引用你想要的内存位置的值吗? / p>

1 个答案:

答案 0 :(得分:1)

两种情况下都会取消引用指针。但是at执行范围检查,如果失败则抛出异常,因此第二种方法会变慢。

正确的方法可能如下所示:

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

由于您的代码假定指针始终有效,因此没有一个理由可以使用它而不是引用。 See Cpp Core Guidelines