假设我有一个向量,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);
}
}
由于您的代码假定指针始终有效,因此没有单一的理由使用它而不是引用。请参阅 CPP 核心指南。