-4

これらは効果的に同じことをしていますか?

vector<MyType> stuff;
MyClass(MyType *things, int numThings){
    for (int i = 0; i < numThings; ++i){
        //stuff[i] = things[i]; //original version of question, fixed
         stuff.push_back(things[i]);
    }
}

対。

vector<MyType> stuff;
MyClass(MyType *things, int numThings) : stuff(things, things+numThings) {}//fixed

そうである場合、どちらのアプローチを使用しても多かれ少なかれオーバーヘッドはありますか? (方法 1 の追加入力を除く)

4

3 に答える 3

5

いいえ。

最初のメソッドは、サイズがゼロのベクトルの末尾を超える要素にアクセスするため、クラッシュします。最初にベクトルのサイズを変更してこのバグを修正すると、ベクトル内の要素が最初に初期化され、次に を使用して上書きされますoperator=。代わりにpush_back()、ループ内で使用することによってバグが修正された場合、ベクターはループ中にサイズ変更される可能性があります。

2 番目の方法は、目的の内容でベクトルを 1 つのステップで初期化します。この方法の方が簡単で、明らかに正しいため、この方法をお勧めします。また、ベクトルのサイズ変更のオーバーヘッドはなく、要素を 2 回初期化するオーバーヘッドもありません。

編集: 2番目のものもバグのようです:

stuff(things, numThings)

する必要があります

stuff(things, things + numThings)

標準ライブラリ クラスのすべてのコンストラクターを思い出すことはできません。面白いことstringに、このコンストラクターはありますが、そうでvectorはありません。

固定バージョン

次の 2 つのバージョンはほぼ同等です。

MyClass(MyType *things, int numThings)
{
    stuff.reserve(numThings);
    for (int i = 0; i < numThings; i++)
        stuff.push_back(things[i]);
}

MyClass(MyType *things, int numThings)
    : stuff(things, things + numThings);
{ }
于 2013-02-03T23:32:39.970 に答える
2

これはおそらく最高でしょう:

MyClass(MyType*things, int numThings) : stuff(things, things + numThings) {}
//                                                    ^^^^^^^^^^^^^^^^^^
于 2013-02-03T23:34:31.033 に答える
1

同じ結果の意味によって異なります。両方の方法が実際に機能したと仮定すると(Dietrichや他の人の提案に一致するように2番目の方法を変更する必要があります)、初期化子リストを使用する方法と、コンストラクターの本体にベクトルが入力される方法があります。

2つ目は、コンストラクター本体の先頭で内容が有効なベクトルになります。

どちらのアプローチも同じサイズと内容のベクトルで終了しますが、次の理由から2番目のアプローチが推奨されます。

  1. きれいです
  2. また、おそらくより高速です。
于 2013-02-03T23:44:12.227 に答える