我希望能帮助调试multiset容器的一些奇怪行为。偶尔,容器似乎停止排序。这是一个偶然的错误,在很长一段时间之后只有一些模拟中显而易见,并且我对想法不甚了解。 (我是一个业余程序员 - 各类建议,欢迎。)Multiset容器似乎停止排序
我的容器是std::multiset
持有Event
结构:
typedef std::multiset< Event, std::less<Event> > EventPQ;
与他们double time
成员排序的Event
结构:
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);
做即使这个代码看起来还好,我想知道其他的方式我可以检查这是怎么回事 - 我目前使用了大量的断言()和cout < <检查。
为什么'oldRecTime'没有分配任何值? – AnT 2010-05-17 19:17:26
为什么使用multiset当你走出自己的方式,以防止重复被添加? – 2010-05-17 19:22:33
@Andrey:我不知道如何综合这里的问题代码。我在模拟中搜索之前定义了oldRecTime。 (具体来说就是先前计划从感染中恢复的时间,并且它存储在Host类中。当发生感染事件时,我将重新计算先前计划的所有恢复时间,从currentEvents中删除它们的相应事件并添加更新的事件。) – Sarah 2010-05-17 19:26:40