我希望能幫助調試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