Очередь шаблонов команд упорядочена по времени?
Я изменяю некоторый код для использования шаблона команды и буду хранить объекты команды в очереди. Команды должны будут выполняться в определенное время, поэтому я буду перебирать список раз в секунду, чтобы найти команды для выполнения.
Будет время, связанное с каждым объектом команды, и я проверю это время против текущего времени (в пределах небольшого порога). Поэтому мне нужно удалить объект команды из списка, если его время совпадает, и затем выполнить его. Обычно в каждый момент времени будет менее 10 команд. Какую структуру данных коллекции мне следует использовать и как мне удалять объекты команд при повторении списка?
2 ответа
Я думаю, что вы хотите использовать приоритетную очередь. Это контейнер, который позволяет вам извлечь элемент с наивысшим приоритетом. В вашем случае "более высокий приоритет" - это "случается первым".
C++ моделирует приоритетную очередь как priority_queue
контейнерный адаптер. Это означает, что внутри него есть какой-то другой контейнер, который выполняет фактическое хранение. Этот контейнер обычно либо vector
или же deque
, (Требуются итераторы с произвольным доступом.) По умолчанию vector
, Так что вы можете просто объявить:
std::priority_queue<T, vector<T>, Compare> queue;
где T
ваша стихия и Compare
это функция, которая сравнивает два T
элементы и возврат true
если первый имеет более низкий приоритет, чем второй. Если у вас есть operator <
определено для вашего типа T
становится еще проще:
std::priority_queue<T> queue;
- Чтобы поместить элемент в очередь:
queue.push(item);
- Чтобы получить элемент с наивысшим приоритетом:
queue.top()
- Чтобы удалить верхний элемент очереди:
queue.pop();
Обратите внимание, что pop()
не возвращает удаленный элемент; это только удаляет и разрушает это.
Альтернативой решению Майка является использование упорядоченной карты, которая в случае STL является просто map
, Вы можете сохранить время как ключ и команду как значение. В зависимости от вашего случая это может быть удобнее, чем очередь.
Если две команды разрешены для выполнения одновременно, то вы должны использовать multimap
,
multimap<time_t, Command> schedule;
schedule.insert(pair<time_t, Command>(123456, formatHDDCommand));