Я ищу класс контейнера, подобный множеству, который имеет следующие основные свойства:
- имеет амортизированное O (1) время вставки, дублирующие вставки игнорируются
- имеет O(n) время итерации (в частности, O (емкость) недопустимо)
- повторно использует память / выделяет только при превышении текущей емкости
Вариант использованияв том, что у меня есть большой контейнер объектов.Во время каждого цикла я добавляю подмножество этих объектов в этот новый контейнер.Это подмножество может содержать от 1-5 объектов или до 10% от всего набора.Затем я перебираю объекты в этом новом наборе.Каждый цикл объект будет очищен, и обработка будет начата снова.
Мой оригинальный подход использовал инвазивное логическое значение для объектов, указывающее, принадлежало ли оно этому новому набору.Таким образом, вставка была истинным постоянным временем, и она не использовала новую память.Однако итерация была неоптимальной.
Я попробовал boost::unordered_set
и получил худшую производительность, чем мой первоначальный подход.Предположительно, поскольку, как хэш-карта, она не соответствует точке № 2.
Точка № 3 актуальна, поскольку я кодирую на уровне задержки, когда стоимость выделения памяти очень значительна.Таким образом, крайне маловероятно, что контейнер с непрерывным распределением будет работать хорошо.