0

OK、ここに私の問題があります:

  • 私はMyClassいくつかの変数(そのうちの1つはscore)を持つクラス(それを と呼びましょう)を持っています
  • オブジェクトのベクトルもありMyClassます(例vector<MyClass> MyObjects;

ここで、( を使用して) 配列を並べsort(MyObjects.begin(),MyObjects.end(),MyClassCompare());替えようとしたところ、パフォーマンスが大幅に低下したことに気付きました (また、ベクターの一部の要素が最終的にはまったく必要ない可能性もあります)。次のことを試みています。

  • (現在の)最大要素(最大score値を持つ要素)を選択します
  • ベクトルからそれを削除します
  • 次の最大要素を選択
  • 等々...

C ++で組み込み関数/ライブラリを使用してそれを達成する方法はありますか? 何か案は?


ヒント:速度とパフォーマンスは非常に重要です。

4

2 に答える 2

1

コレクションの最大値の要素にアクセスする必要がある場合は、(a) 挿入時の前もって、または (b) 検索時のいずれかでパフォーマンス ヒットが発生する必要があります。(b) は、おそらく選択した方法のせいでコストがかかることに気付き、どうすればこれをより速くできるかを尋ねています。

priority_queueおそらくまさにあなたが探しているものを提供します。パフォーマンスは現在のコードよりも優れていると思います。

于 2013-01-30T16:27:45.787 に答える
0

後で何らかの順序(最大、最小など)で選択するデータを「収集」する場合は、いくつかの選択肢があります。

  1. あなたが行くように並べ替えます。
  2. すべてのデータを収集したら並べ替えます。
  3. データを検索するときのパフォーマンスが低下します。
  4. 並べ替えられていないデータ項目へのある種のインデックスを使用して、1つが並べ替えられている2つのデータセットを作成します。

あなたの場合、コレクションからもいくつかのデータを削除することについて話しています。実際にデータを削除する必要がありますか、それとも単に「不要になった」ものを追跡する必要がありますか?後者の場合、おそらく上記のオプション4が適切な選択です。つまり、ソートされたテーブルからそれを削除するだけです。これはアイテム自体のリストよりもはるかに小さいため[おそらく「MyClass」は2つの整数よりも大きい]。

于 2013-01-30T16:11:42.617 に答える