У меня есть queue
часов. watch
на фронте должен истечь раньше, чем остальные. Таким образом, часы помещаются в конец очереди и выскакивают из передней части очереди. Пока что похоже, что очередь - это структура данных, применимая для этого сценария.
Однако каждые часы имеют идентификационный ключ типа KeyT
. KeyT это LessThanComparable
. Может быть несколько часов, идентифицированных одним и тем же ключом. Часто отправляется уведомление, связанное с ключом. Затем соответствующие часы, идентифицированные с тем же ключом, должны быть уведомлены и удалены из queue (?)
. Поэтому желательно, чтобы соответствующие часы были найдены в сублинейном времени.
Таким образом, требования к контейнеру
- pu sh назад
- pop front
- проиндексирован
- удалить середину
В настоящее время я использую std::list
, поскольку выполняю удаление в середине. Чтобы найти подходящие часы, мне нужно выполнить линейный поиск по всему списку (пропущено 3). std::queue
нельзя использовать, потому что он не повторяется.
Другое решение, которое я еще не реализовал, - это наличие двух контейнеров. Поскольку std::list
является стабильным контейнером, итераторы не будут аннулированы удалением какого-либо другого элемента. Поэтому безопасно хранить итератор внутри std::map
. С другой стороны, выполняется требование 3.
std::list<watch>
std::multimap<KeyT, std::list<watch>::iterator>
С другой стороны, это увеличивает потребность в памяти. Также каждая вставка и удаление должны выполняться дважды на двух контейнерах. Есть ли другие узкие места / лазейки? Есть ли альтернатива для решения этой проблемы? Есть ли в boost
какая-либо структура данных контейнера, которая удовлетворяет требованиям этой проблемы?