繁体   English   中英

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

[英]Modify elements of vector (by value, by reference) Function C++

我有一个函数,我必须修改向量的值。 返回向量是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
}

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

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

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

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

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

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

vec = bow.RemoveSpecialCharacters(vec);

然后绝对第一个选择是去。 否则,第二个似乎更合适。 (从功能名称来看,第一个在我看来更合适)。

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

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

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

最佳实践是通过引用传递向量。

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

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

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

实际上,如果通过良好实践来表示如何在C ++库中完成它,那么对于C ++来说,这两者都不是一个好习惯。 你基本上重新实现了std::remove_copy_ifstd::remove_if所做的事情,所以好的做法是实现函数(或使用现有的函数),这些函数可以通过值或引用来处理范围而不是容器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM