16

我有一个函数,我必须修改向量的值。在 C++ 中返回向量是一个好习惯吗?

功能一:

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;
}

功能二:

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
}
4

7 回答 7

6

您的两个功能用于两个不同的目的。

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

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

于 2013-10-30T09:34:06.933 回答
3

这有点主观。我个人更喜欢后者,因为它不会将复制向量的成本强加给调用者(但调用者仍然可以自由地制作副本,如果他们愿意的话)。

于 2013-10-30T09:33:51.323 回答
2

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

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

vec = bow.RemoveSpecialCharacters(vec);

那么绝对是第一个选择。否则,第二个似乎更合适。(从函数名来看,第一个在我看来更合适)。

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

于 2013-10-30T09:33:52.837 回答
1

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

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

于 2013-10-30T09:32:44.410 回答
1

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

在函数内部你编辑它并且你不必将它返回(实际上你正在分配一个不需要的新内存空间)。

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

于 2013-10-30T09:35:08.123 回答
0

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

于 2013-10-30T09:33:36.003 回答
0

实际上,对于 C++ 来说,两者都不是一个好的实践,如果好的实践是指它是如何在 C++ 库中完成的。您基本上是重新实现什么std::remove_copy_if或做什么std::remove_if,所以好的做法是实现功能(或使用现有的),这些功能适用于范围,而不是容器,无论是通过值还是通过引用。

同样,这取决于您如何定义 term good practice

于 2015-12-09T16:10:37.830 回答