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