2

コマンド パターンを使用するように一部のコードを変更し、コマンド オブジェクトをキューに格納します。コマンドは特定の時間に実行する必要があるため、実行するコマンドを見つけるために 1 秒に 1 回リストを反復処理します。

各コマンド オブジェクトには時間が関連付けられており、この時間を現在の時間と照合します (小さなしきい値内)。そのため、時間が一致する場合はコマンド オブジェクトをリストから削除してから実行する必要があります。通常、常に 10 個未満のコマンドがあります。どのコレクション データ構造を使用する必要がありますか?また、リストの反復中にコマンド オブジェクトを削除するにはどうすればよいですか?

4

2 に答える 2

3

優先キューを使用したいと思います。これは、最も優先度の高いアイテムをプルできるコンテナーです。あなたの場合、「優先度が高い」は「最初に起こる」です。

C++ は、プライオリティ キューをpriority_queueコンテナー アダプターとしてモデル化します。これは、その内部に実際のストレージを行う別のコンテナがあることを意味します。通常、このコンテナは または のいずれvectordequeです。(ランダム アクセス イテレータが必要です。) デフォルトはvectorです。したがって、次のように宣言できます。

std::priority_queue<T, vector<T>, Compare> queue;

whereTは要素でCompareあり、2 つの要素を比較し、最初の要素が 2 番目の要素より優先度が低い場合にT返す関数です。type を定義したtrue場合は、さらに簡単になります。operator <T

std::priority_queue<T> queue;
  • アイテムをキューに入れるには:queue.push(item);
  • 最も優先度の高い要素を取得するには:queue.top()
  • キューの一番上のアイテムを削除するには:queue.pop();

pop()削除された要素を返さないことに注意してください。削除して破壊するだけです。

于 2012-04-18T23:20:27.840 に答える
1

Mike のソリューションに代わる方法は、順序付きマップを使用することです。これは、STL の場合は単純にmap. 時間をキーとして、コマンドを値として保持できます。ケースによっては、キューよりも便利な場合があります。

2 つのコマンドを同時に実行できる場合は、 を使用する必要がありますmultimap

multimap<time_t, Command> schedule;

schedule.insert(pair<time_t, Command>(123456, formatHDDCommand));
于 2012-04-18T23:36:52.140 に答える