Я предполагаю, что eventQueue
имеет тип, описанный here (потому что это ссылка на ссылку в вашем вопросе). Оттуда, вы можете прочитать, что top()
...
Возвращает постоянную ссылку на элемент в очереди с наивысшим приоритетом
... и что pop()
...
Удаляет элемент с наивысшим приоритетом из очереди.
Таким образом, принимая код из ваших вопросов, наиболее очевидный подход будет принимать все события из очереди, которые имеют то же самое время, и только затем обработать их:
while (! eventQueue.empty()) {
event * ev = eventQueue.top(); // WHY do you have pointers here ?!?!?
time = ev->time;
some_container<event *> arrivals, departures;
// Take out all events that happen "now" from the queue
while (time == ev->time) {
eventQueue->pop();
if (ev->type == ARRIVAL) {
arrivals.push_back(ev);
} else {
departures.push_back(ev);
}
ev = eventQueue->top();
}
// Process arrivals
for (event * e : arrivals) {
e->processEvent();
delete e; // Again: WTF pointers? raw? NOT a good idea!
}
// Process departures
for (event * e : departures) {
e->processEvent();
delete e;
}
}
НО. ..
... это не идиоматический способ справиться с этим в C++. Контейнеры (по крайней мере, упорядоченные) в C++ обычно имеют параметр шаблона, определяющий способ упорядочивания элементов. И так делает std::priority_queue
:
namespace std {
template <class T,
class Container = vector<T>,
class Compare = less<Container::value_type> >
class priority_queue;
}
Таким образом, лучший подход здесь заключается в создании общего порядка среди всех событий, используя пользовательские функции сравнения объекта:
Обратите внимание, что для этого будет a всего закажите, вы должны быть уверены, что не будет нескольких прибытий (или вылетов) в одно и то же время. Если будут (возможно) такие обстоятельства, то вы должны (если хотите детерминированное моделирование) найти другие свойства (имя? Источник?) Событий, чтобы привести их в порядок.
Ваш eventQueue
затем будет объявлен как
std::priority_queue<event *, std::vector<event *>, less_event_ptr<event>> eventQueue;
Если вы хотите воспроизводимые моделирования, «время» ** есть ** порядок событий. В то же время не бывает двух событий. –
хорошо, я принимаю вашу точку. Но все же у меня есть вопрос, что произойдет, если два события имеют одно и то же время? Можем ли мы детерминистически сказать, какое событие произойдет первым?через остальную симуляцию. Спасибо – user2532296
Если одновременно происходят два события, это ** ошибка **. Это не должно происходить в правильно функционирующей системе. Просто исправьте это. –