Происходит ли динамическое выделение каждый раз, когда элементы вставляются в контейнер std::list?

Если я вставлю элемент в пустой контейнер std::list, я ожидаю, что произойдет выделение памяти для хранения моего элемента. Теперь, если я удалю этот элемент и добавлю новый, освобождается ли выделенная память и перераспределяется при вставке, или общие реализации могут сохранять пул высвобождаемых (стертых) записей, чтобы их можно было использовать повторно?


person Darien Pardinas    schedule 11.09.2014    source источник


Ответы (1)


std::list<> реализует структуру данных связанного списка и, таким образом (концептуально), выделяет новую память каждый раз, когда вставляется элемент. При этом все стандартные классы контейнеров принимают параметр типа, который представляет используемый распределитель. С помощью этого параметра вы можете изменить распределитель на тот, который просто возвращает указатели в предварительно выделенную область памяти. Конечно, если вы заранее знаете, сколько памяти вам понадобится, непонятно, зачем использовать этот тип структуры данных.

person Michael Aaron Safyan    schedule 11.09.2014
comment
Мне нужно использовать список вместо очереди, потому что я буду вставлять и с одного конца и удалять с другого конца, и будут другие объекты с итераторами, которые не могут быть признаны недействительными при вставках или удалениях. Это необходимо для реализации движущегося окна данных с нерегулярной выборкой. - person Darien Pardinas; 11.09.2014
comment
Как вы собираетесь, чтобы итератор не стал недействительным, если элемент будет удален? Это не имеет смысла независимо от структуры данных. - person Michael Aaron Safyan; 11.09.2014
comment
Элементы удаляются только в начале контейнера (старые образцы) и добавляются в конце (самые новые образцы). Итераторы, о которых я говорю, переместились бы на более свежий элемент, когда я удаляю то, что мне больше не нужно (очень старые образцы). - person Darien Pardinas; 11.09.2014