Очередь шаблонов команд упорядочена по времени?

Я изменяю некоторый код для использования шаблона команды и буду хранить объекты команды в очереди. Команды должны будут выполняться в определенное время, поэтому я буду перебирать список раз в секунду, чтобы найти команды для выполнения.

Будет время, связанное с каждым объектом команды, и я проверю это время против текущего времени (в пределах небольшого порога). Поэтому мне нужно удалить объект команды из списка, если его время совпадает, и затем выполнить его. Обычно в каждый момент времени будет менее 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));
Другие вопросы по тегам