マルチセットコンテナによる奇妙な動作のデバッグにご協力いただければ幸いです。場合によっては、コンテナが並べ替えを停止しているように見えます。これはまれなエラーであり、久しぶりの一部のシミュレーションでのみ明らかになり、アイデアが不足しています。(私はアマチュアプログラマーです。あらゆる種類の提案を歓迎します。)
私のコンテナは構造体std::multiset
を保持するものですEvent
:
typedef std::multiset< Event, std::less< Event > > EventPQ;
メンバーEvent
でソートされた構造体を使用して:double time
struct Event {
public:
explicit Event(double t) : time(t), eventID(), hostID(), s() {}
Event(double t, int eid, int hid, int stype) : time(t), eventID( eid ), hostID( hid ), s(stype) {}
bool operator < ( const Event & rhs ) const {
return ( time < rhs.time );
}
double time;
...
};
プログラムは、順序付けられていない時間のイベントを追加しEventPQ currentEvents
、次にイベントを順番にプルする期間を繰り返します。まれに、いくつかのイベントが追加された後(完全に「合法的な」時間で)、イベントが順不同で実行され始めます。
イベントが適切に順序付けられない原因は何ですか?(または、イテレータを台無しにする可能性がありますか?)追加されたすべてのイベント時間が正当である(つまり、すべてが現在のシミュレーション時間を超えている)ことを確認しました。また、2つのイベントがスケジュールされているため、エラーが発生しないことも確認しました。同時に。
これをどのように処理するかについての提案が欲しいです。
好奇心旺盛な方のために、イベントを実行および追加するためのコードを以下に示します。
double t = 0.0;
double nextTimeStep = t + EPID_DELTA_T;
EventPQ::iterator eventIter = currentEvents.begin();
while ( t < EPID_SIM_LENGTH ) {
// Add some events to currentEvents
while ( ( *eventIter ).time < nextTimeStep ) {
Event thisEvent = *eventIter;
t = thisEvent.time;
executeEvent( thisEvent );
eventCtr++;
currentEvents.erase( eventIter );
eventIter = currentEvents.begin();
}
t = nextTimeStep;
nextTimeStep += EPID_DELTA_T;
}
void Simulation::addEvent( double et, int eid, int hid, int s ) {
assert( currentEvents.find( Event(et) ) == currentEvents.end() );
Event thisEvent( et, eid, hid, s );
currentEvents.insert( thisEvent );
}
イベントが実行されると、から他のイベントが削除される場合があることを追加する必要がありますcurrentEvents
。これはで行われます
double oldRecTime = 10.0; // gets defined legitimately in simulation
EventPQ::iterator epqItr = currentEvents.find( Event(oldRecTime) );
assert( currentEvents.count( Event(oldRecTime) ) == 1 );
currentEvents.erase( epqItr );
このコードは問題ないように見えますが、何が起こっているのかを調べる他の方法を知りたいです。現在、多くのasserts()とcout<<チェックを使用しています。