10

現在のコードでは、作成したベクターに新しいDrawObjectsを挿入したいと考えています。

std ::vector<DrawObject>オブジェクト;

違いは何ですか:

objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber));

objects.push_back(new DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber));
4

4 に答える 4

18

1つ目は非ポインタオブジェクトを追加し、2つ目はベクトルへのポインタを追加します。したがって、それはすべて、どちらを実行するかについてのベクトルの宣言に依存します。

あなたの場合、あなたはとして宣言objectsしてstd::vector<DrawObject>いるので、最初のものは機能し、objectsタイプのアイテムを保存することができますがDrawObject、ではありませんDrawObject*

C ++ 11では、次のように使用できますemplace_back

objects.emplace_back(name, surfaceFile, xPos, yPos, 
                     willMoveVar, animationNumber);

違いに注意してください。と比較してください:

objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, 
                            willMoveVar, animationNumber));

を使用emplace_backすると、呼び出しサイトでオブジェクトを作成せず、代わりに引数をvectorに渡し、vectorが内部でオブジェクトを作成します。場合によっては、これはより高速になる可能性があります。

emplace_backに関するドキュメントを読んでください(私のものを強調してください)、

コンテナの最後に新しい要素を追加します。要素はインプレースで構築されます。つまり、コピーまたは移動操作は実行されません。要素のコンストラクターは、関数に提供されるのとまったく同じ引数で呼び出されます。

コピー移動を回避するため、結果のコードは少し速くなる可能性があります。

于 2013-01-05T19:42:00.163 に答える
1

与えられた

std::vector< DrawObject > objects;

2つのバージョンの違いは、最初のバージョンは正しく、2番目のバージョンは正しくないことです。

コメントに示されているように、2番目のバージョンがコンパイルされると、期待どおりの動作をしません。DrawObjectまた、おそらくいくつかのコンストラクターの作成を検討する必要があることも示唆していますexplicit

于 2013-01-05T19:41:07.753 に答える
1

2番目のバージョンは、DrawObjectへのポインターobjectsのベクトルであると想定していますが、最初のバージョンは、オブジェクト自体を保持することを想定しています。したがって、宣言に応じて、バージョンの1つだけがコンパイルされます。objectsobjects

行った方法を宣言するobjectsと、最初のバージョンのみがコンパイルされます。オブジェクトを宣言するとstd::vector< DrawObject*> objects;、2番目のバージョンのみがコンパイルされます。

于 2013-01-05T19:41:26.163 に答える
0

キーワードを使用してオブジェクトを作成する場合newは、ヒープに割り当てます。これにより、オブジェクトへのポインタが返されます。

キーワードなしでオブジェクトを作成する場合と同様に、オブジェクトnewはスタックに割り当てられ、そのオブジェクトに適切にアクセスできるようになります。

于 2013-01-05T19:41:22.703 に答える