1

ここに投稿するのは初めてで、これは私を夢中にさせています! うまく説明できないので、例を挙げてみます。

非常に大きな ( 100k ) ベクトルの要素を取得して消去しようとしています。それは何年もかかるでしょう...だから私はこれを試しました:

これは私のリストの小さな例です。これは、シングルトンの Particle Emitter クラスに格納されています。

vector<Particle> particles;
particles.reserve(100);

これは私のパーティクルの削除されたバージョンです

class Particle
{
Particle:
~Particle:

void Delete
{
  int listNum = (this - &particles[0]);
  particles.erase(particles.begin+listNum);
}
};

これは問題なく機能しますが、すべてのパーティクルをスタックに保存したくないので、これを変更したいと思います

vector<Particle> particles;

の中へ

vector<Particle*> particles;

ここで私の質問: ベクトルが粒子ポインターで構成されている場合、リストから粒子を削除して消去することはまだ可能ですか?

私の質問が明確かどうかわかりませんが、ご理解いただければ幸いです。

または、誰かがより優れたパフォーマンスの賢明な解決策を知っている場合は、それを聞きたいです!

前もって感謝します!

4

2 に答える 2

1

これをどのように使用する予定std::vectorですか?

繰り返しには時間がかかると言いますが、目標がすべての値を繰り返し処理することである場合、連続した配列よりもうまくいくことはありません。コンテナから要素を削除することについて話していますが、これはまさに動的配列が必要であることを示唆していますstd::vector

とにかく、生のポインターのベクトルを格納したくないことは間違いありません。特定の操作を使用したためにパフォーマンスが不足していることが測定された場合、2 つのオプションはstd::vector<Particle>(一般に推奨) または(C++11 のみ) である必要があります。std::vector<unique_ptr<Particle>>ユースケースによっては、std::map<Particle>またはstd::set<Particle>良いアイデアかもしれませんが、十分な情報がありません。

Particleスタックに何も格納していません。a のすべての要素は、std::vectorすでにフリー ストア (「ヒープ」) にあります。

Particle挿入と削除のコードも、クラスとは何の関係もありません。挿入と削除は、含まれている要素に対する操作ではなく、コンテナーに対する操作です。

あなたの質問に答えるには、いくつか知っておく必要があります。

まず、大きさはParticle?これはおそらく最も重要な情報です。

第二に、コンテナで何をしていますか? あなたは通常、すべてを見てそれらを使って何かをしていますか、それともコンテナ全体Particleで特定のものを探していますか? Particle検索する場合、何らかのキーに基づいて検索しようとしますか (たとえば、それぞれParticleに一意の ID があり、その ID で全体を検索しParticleます)、または 1 つParticleが別のキーと一致するかどうかを確認するために検索しますか (つまり、つまり、) の ID に基づいて検索しますParticleか?

個人Particlestd::set検索する場合は、二分探索が可能なので、使いやすさからおそらく最初の選択肢となるでしょう。ユースケースでキーでパーティクルを検索する必要がある場合は、std::map<Key, Particle>.

多数のパーティクルがあり、コンテナからいくつかを削除したい場合、オブジェクトのサイズがかなり重要になります。ただし、通常、std::vectorこのような状況では が必要になります。

要するに、あなたの質問に完全に答えるには、より多くの情報が必要です。

于 2012-11-17T20:43:34.603 に答える
-1

ベクトルをスタックに置くことを心配している場合は、次のようなものを試してみませんか。

vector <Particle> * particles = new vector <Particle>;

これにより、ベクトルはあなたがdeleteそれまで続くようになります。また、パフォーマンスの問題が心配な場合は、setaをお勧めします。これにより、すべての挿入と削除が対数時間になり、独自の削除機能を使用する必要がなくなることが保証されます。C ++ 11のパフォーマンスをさらに向上させるには、を試してくださいunordered_set

于 2012-11-17T19:51:13.577 に答える