假设我有一个向量 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>
答案 0 :(得分:1)
两种情况下都会取消引用指针。但是at
执行范围检查,如果失败则抛出异常,因此第二种方法会变慢。
正确的方法可能如下所示:
void foo(::std::vector<int> & v)
{
for(auto & el: v)
{
bar(el);
}
}
由于您的代码假定指针始终有效,因此没有一个理由可以使用它而不是引用。 See Cpp Core Guidelines