Я ищу контейнер, который сохраняет его, содержал позиции объектов в памяти (указатели остаются в силе)
Контейнер будет расти и постоянно сжиматься. Элементы в середине могут быть стерты, но нет посещений в середине; все элементы выдвигаются на заднюю часть контейнера. Итераторская валидность не важна в этом случае, моя единственная проблема заключается в том, что указатели остаются в силе.
Является std::deque
безопасным и эффективным вариантом в этой ситуации? Раньше я использовал список, но он слишком много раз выделял, чтобы быть полезным в этом случае.
В отличие от std :: vector, элементы deque не сохраняются смежно: в типичных реализациях используется последовательность индивидуально распределенных массивов фиксированного размера. Хранилище deque автоматически расширяется и сокращается по мере необходимости. Расширение deque дешевле, чем расширение std :: vector, поскольку оно не связано с копированием существующих элементов в новое место памяти
Нет. std::deque
обязательно реализуется с использованием кусков. Стирание в середине фрагмента по крайней мере приведет к недействительности адресов всех последующих элементов в этом фрагменте.
Обратите внимание, что аннулирование итератора и недействительность указателя обычно тесно связаны. Итератор часто является указателем на элемент (узел, содержащий), с добавлением правильной семантики итерации. Такие итераторы становятся недействительными, потому что указатель, который они содержат, недействителен.
Вставка или удаление элементов в середине делает недействительными все итераторы и ссылки.
Вставка элементов в начале/конце делает недействительными итераторы, но не влияет на ссылки.
Удаление элементов в начале/конце не влияет на итераторы или ссылки, кроме тех, которые указывают на удаленный элемент и, возможно, итератор прошедшего конца.
http://en.cppreference.com/w/cpp/container/deque/erase
Все итераторы и ссылки недействительны, если только стертые элементы не находятся в конце или в начале контейнера, и в этом случае недействительны только итераторы и ссылки на стертые элементы.
http://en.cppreference.com/w/cpp/container/deque/push_back
Все итераторы, включая итератор прошлого, недействительны. Никакие ссылки недействительны.
(другие методы, которые работают на переднем или заднем элементах, имеют похожие примечания).