我会很感激帮助调试多集容器的一些奇怪行为。有时,容器似乎停止排序。这是一个罕见的错误,很长一段时间后仅在一些模拟中才明显,而且我缺乏想法。(我是一个业余程序员——欢迎各种建议。)
我的容器是一个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
然后按顺序拉出事件的周期。很少,在添加了一些事件之后(具有完全“合法”的时间),事件开始无序执行。
是什么导致事件无法正确排序?(或者什么会弄乱迭代器?)我已经检查了所有添加的事件时间都是合法的(即,都超过了当前的模拟时间),并且我还确认了错误不会发生,因为两个事件恰好被安排同时。
我很想就如何解决这个问题提出建议。
执行和添加事件的代码如下:
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 << 检查。