【问题标题】:C++: How to properly go through vector pointed toC ++:如何正确通过指向的向量
【发布时间】:2017-08-21 20:13:41
【问题描述】:

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

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

【问题讨论】:

  • 您是否考虑过改用void foo(std::vector&lt;int&gt; &amp;v)
  • 这至少是c++11,不是吗?
  • 如果你要改变vector然后通过引用传递,如果不是那么通过引用传递给const。
  • @Yunnosch 如果他尝试使用带有该循环语法的auto,一定是这样。
  • @nwp,不,我没有,不知道它存在,见下文。 Yunnosch,是的,是的。罗恩,这是一个很好的建议,我从来没有意识到你可以以一种有意义的方式在两者之间进行交流。

标签: c++ loops pointers vector dereference


【解决方案1】:

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

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

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

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

【讨论】:

  • 好吧,我的想法是取消引用整个向量是不必要的,因为我们只能用at 取消引用一个元素。但是我被错误地告知了取消引用的工作原理。我也不知道你可以去:::std::vector&lt;int&gt; &amp; v 传递参考,我以为你做到了:std::vector&lt;int&gt;* v。你知道的越多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多