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.
假设我有一个向量,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.