16

ベクトルの値を変更する必要がある関数があります。ベクトルを返すことは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
}
4

7 に答える 7

6

あなたの 2 つの機能は、2 つの異なる目的に役立ちます。

  • 機能 1: として動作しremove_copyます。既存のコンテナーは変更されません。コピーを作成し、代わりにそれを変更します。

  • 機能 2: として動作しremoveます。既存のコンテナを変更します。

于 2013-10-30T09:34:06.933 に答える
3

やや主観的です。私は個人的には後者を好みます。なぜなら、ベクトルを呼び出し元にコピーするコストがかからないからです (ただし、呼び出し元は、必要に応じて自由にコピーを作成できます)。

于 2013-10-30T09:33:51.323 に答える
2

この特定のケースでは、参照渡しを選択しますが、それが C++ の慣行であるかどうかではなく、実際にはより理にかなっているからです (その名前の関数はベクトルに変更を適用します)。関数からデータを返す必要はないようです。

しかし、それは関数の目的にも依存します。常に次のように使用したい場合:

vec = bow.RemoveSpecialCharacters(vec);

次に、絶対に最初のオプションを選択します。それ以外の場合は、2 番目の方が適しているようです。(関数名から判断すると、最初のものの方が適切なようです)

パフォーマンスに関しては、最新の C++11 の世界での最初のソリューションは、いくつかの割り当てが遅くなるため、パフォーマンスへの影響はごくわずかです。

于 2013-10-30T09:33:52.837 に答える
1

ベスト プラクティスは、ベクターを参照渡しすることです。

関数内で編集し、元に戻す必要はありません (実際には、必要のない新しいメモリ空間を割り当てています)。

参照で渡す場合、コストははるかに小さくなり、ベクトルも関数の範囲外に編集されます

于 2013-10-30T09:35:08.123 に答える
1

オプション 2に進み、パラメーターとして渡されたベクトルを変更します。

補足: 一部のコーディング プラクティスでは、変更される可能性のあるポインター引数を渡すことを提案しています (関数が引数を変更する可能性があることを開発者に一目で明確にするためです)。

于 2013-10-30T09:32:44.410 に答える
0

最初の関数はベクトルのコピーを返すため、2 番目の関数よりも遅くなります。2番目を使用する必要があります。

于 2013-10-30T09:33:36.003 に答える