Если вы хотите удалить самое низкое значение, используйте отсортированный список, а если у вас больше элементов, чем нужно, удалите самое низкое.
Если вы хотите удалить самое старое значение, используйте набор и очередь. И набор, и очередь содержат копию каждого значения. Если значение находится в наборе, нет операции. Если значение отсутствует в наборе, добавьте значение в очередь и добавьте его в набор. Если вы превысили свой размер, откройте очередь и удалите это значение из набора.
Если вам нужно переместить дублированные значения в конец очереди, вам нужно переключиться из набора в отображение значений хеш-таблицы на стабильные итераторы в очередь и иметь возможность удалять из середины очереди.
Кроме того, вы можете использовать отсортированный список и хеш-таблицу. Вместо того, чтобы просто помещать ваши значения в отсортированный список, вы можете поместить пары (id, value) и затем получить карту хэш-таблицы от значения до (id, value). id будет просто увеличиваться после каждой вставки. Когда вы находите совпадение в хеш-таблице, вы удаляете это (id, значение) из списка и добавляете новую пару (id, значение) в конец списка. В противном случае вы просто добавляете в конец списка и всплываете с самого начала, если он слишком длинный.