【问题标题】:when should i pass a vector parameter by reference versus passing one by value?我什么时候应该通过引用传递向量参数而不是按值传递向量参数?
【发布时间】:2018-10-24 00:22:48
【问题描述】:

我应该什么时候添加 & 符号?我有一些来自我的硬件的例子:

以下情况应该如何定义函数的向量参数age?

1)ages 总是很小(少于 10 个元素)并且函数不会修改向量。 解答: 常量但不通过引用传递。

2)ages 总是很小,函数会修改向量。 答案:通过引用传递,但不是常量

我理解不恒定的部分.. 但不是通过引用传递:/ 为什么我要添加与号以使其通过引用传递而不是不传递

【问题讨论】:

  • 很难理解这些陈述。例如,当您说函数将修改向量时,这是否意味着这些修改必须在函数返回时保留或不能保留?目前尚不清楚该短语具有两个相反的含义中的哪一个。
  • 说明中也不清楚。这就是它给我的全部:/

标签: c++ function vector parameters


【解决方案1】:

通过引用传递将允许函数修改参数的实际数据 - 这意味着函数内部发生的任何更改都将在函数返回后保留。

按值传递意味着函数正在处理数据的副本。

在某些情况下,例如在处理非常大的数据集时,按值传递可能会导致性能问题,因为要复制的数据太多(在极少数情况下,您使用的内存非常有限,按值传递甚至可能不是一种选择。)在这些情况下,您将通过 const 引用传递,这样您就不必为函数提供其自己的数据副本并且该函数没有'不修改传入的实际数据。

【讨论】:

    【解决方案2】:

    这比你的作业建议的要简单得多,但是为了获得正确的分数:

    它谈到了vector 将如何变小,因为复制一个大向量可能代价高昂(性能方面)。如果您的函数不会修改vector,并且vector 会很小,那么只需传递一个副本即可。一个例子是打印vector的函数:

    void print(const std::vector<int> v) // const because we don't modify v
    {
        for (auto i : v)
           std::cout << i << ", ";
    }
    

    当我们有一个需要修改 vector 的函数(并且需要在函数结束后观察这些更改)时,引用更有意义:

    void removeDuplicates(std::vector<int>& v)
    {        
    }
    

    这里removeDuplicates 采用非常量引用,因为它修改了它。不管vector的大小,我们期望函数修改传入的vector

    std::vector<int> v;
    // populate v
    ...
    removeDuplicates(v);
    // v may now be different
    

    如果您有一个修改参数的函数,但这些修改不应该在函数之外看到,那么非常量副本就足够了。想象一下,我们的print 函数打印元素四舍五入到最接近的100(当然我们可以即时执行此操作,但我们可能会先更改vector,然后调用我们原来的print)。

    对于现实世界的建议,您通常应该只传递一份副本,除非:
    * 您的函数正在存储传递参数的引用,或者
    * 修改函数结束后需要观察变化的地方

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2015-03-24
      • 1970-01-01
      相关资源
      最近更新 更多