我何时应该通过引用传递矢量参数而不是通过值传递矢量参数?

时间:2018-10-24 00:22:49

标签: c++ function vector parameters

我应该何时添加&符?我从我的硬件中获得了一些例子:

在以下情况下,应如何定义函数的矢量参数使用期限?

1)年龄将始终很小(少于10个元素),并且该函数不会修改向量。 解答:常量,但不能通过引用传递。

2)年龄将永远很小,并且该函数将修改向量。 解答:通过引用传递但不是常量

我理解不固定的部分..但不能通过引用传递:/为什么我添加&符以使其通过引用传递而不是

2 个答案:

答案 0 :(得分:1)

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

传递值表示该函数正在处理数据的副本。

在某些情况下(例如,如果您使用的是非常大的数据集),由于要复制的数据太多,因此按值传递可能会导致性能问题(在极少数情况下,如果您使用的内存非常有限,在这些情况下,您可能会通过const引用进行传递,这样就不必为函数提供数据的自己副本函数不会修改传入的实际数据。

答案 1 :(得分:0)

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

它讨论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

相反,如果您有一个修改参数的函数,但是不应在函数外部看到这些修改,则非const副本就足够了。想象一下,我们的print函数将打印的元素四舍五入到最接近的100(确保我们可以即时进行此操作,但是我们可以先更改vector,然后再调用原始的{{1} }。

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