修改向量的元素(按值、按引用) 函数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

最新更新