修改向量的元素(按值,按引用)函数C ++

时间:2013-10-30 09:30:07

标签: c++ function vector pass-by-reference pass-by-value

我有一个功能,我必须修改矢量的值。 在C ++中返回向量是一种很好的做法吗?

功能1:

vector<string> RemoveSpecialCharacters(vector<string> words)
{
    for (vector<string>::iterator it=words.begin(); it!=words.end(); )
    {
        if(CheckLength(*it) == false)
        {
            it = words.erase(it);
        }
        else{
            ++it;
        }
    }//end for

    return words;
}

功能2:

void RemoveSpecialCharacters(vector<string> & words)
{
    for (vector<string>::iterator it=words.begin(); it!=words.end(); )
    {
        if(CheckLength(*it) == false)
        {
            it = words.erase(it);
        }
        else{
            ++it;
        }
    }//end for
}

7 个答案:

答案 0 :(得分:6)

您的两个功能有两个不同的用途。

  • 功能1:作为remove_copy使用。它将修改现有容器;它会复制并修改它。

  • 功能2:作为remove使用。它将修改现有容器。

答案 1 :(得分:3)

这有点主观。我个人更喜欢后者,因为它没有强制将矢量复制到调用者的成本(但是如果他们选择的话,调用者仍然可以自由地制作副本)。

答案 2 :(得分:2)

在这种特殊情况下,我选择通过引用传递,但不是因为它是一个C ++实践,而是因为它实际上更有意义(函数的名称将修改应用于向量)。似乎没有实际的需要来从函数返回数据。

但这也取决于功能的目的。如果总是想要以下列方式使用它:

vec = bow.RemoveSpecialCharacters(vec);

然后绝对第一个选择是去。否则,第二个似乎更合适。 (根据功能名称判断,第一个似乎给我更合适。)

在性能方面,现代C ++ 11世界中的第一个解决方案将更少一些分配速度更慢,因此性能影响可以忽略不计。

答案 3 :(得分:1)

转到选项2 ,修改作为参数传递的向量。

旁注:一些编码实践建议传递可能被更改的指针参数(只是为了让开发人员首先明白该函数可能会改变参数)。

答案 4 :(得分:1)

最佳做法是通过引用传递向量。

在编辑它的函数内部,您不必将其返回(事实上,您正在分配一个不需要的新内存空间)。

如果您通过引用传递它,则成本会小得多,并且矢量也会在函数范围之外进行编辑

答案 5 :(得分:0)

第一个函数将返回向量的副本,因此它将慢于第二个。你应该使用第二个。

答案 6 :(得分:0)

实际上,对于C ++来说,没有一个是好的做法,如果通过良好的实践来表示它是如何在C ++库中完成的。您基本上重新实现了std::remove_copy_ifstd::remove_if所做的事情,因此良好的做法是实现函数(或使用现有函数),这些函数适用于范围,而不是容器,无论是通过值还是通过引用。

这又取决于您如何定义术语good practice