Сохранит ли std :: deque правильность указателя содержащихся в нем объектов?

0

Я ищу контейнер, который сохраняет его, содержал позиции объектов в памяти (указатели остаются в силе)

Контейнер будет расти и постоянно сжиматься. Элементы в середине могут быть стерты, но нет посещений в середине; все элементы выдвигаются на заднюю часть контейнера. Итераторская валидность не важна в этом случае, моя единственная проблема заключается в том, что указатели остаются в силе.

Является std::deque безопасным и эффективным вариантом в этой ситуации? Раньше я использовал список, но он слишком много раз выделял, чтобы быть полезным в этом случае.

  • 2
    отвечает на ваш вопрос stackoverflow.com/questions/6438086/iterator-invalidation-rules ? (он не только охватывает итераторы, но и перечисляет правила аннулирования ссылок / указателей)
  • 0
    @ Кубби - Это делает, это делает! Это удобно иметь в одном месте, наконец, спасибо!
Показать ещё 1 комментарий
Теги:
list
memory
visual-studio-2010
deque

3 ответа

-2
Лучший ответ

В отличие от std :: vector, элементы deque не сохраняются смежно: в типичных реализациях используется последовательность индивидуально распределенных массивов фиксированного размера. Хранилище deque автоматически расширяется и сокращается по мере необходимости. Расширение deque дешевле, чем расширение std :: vector, поскольку оно не связано с копированием существующих элементов в новое место памяти

  • 2
    Так это да или нет?
  • 0
    это большой жирный НЕТ
4

Нет. std::deque обязательно реализуется с использованием кусков. Стирание в середине фрагмента по крайней мере приведет к недействительности адресов всех последующих элементов в этом фрагменте.

Обратите внимание, что аннулирование итератора и недействительность указателя обычно тесно связаны. Итератор часто является указателем на элемент (узел, содержащий), с добавлением правильной семантики итерации. Такие итераторы становятся недействительными, потому что указатель, который они содержат, недействителен.

  • 0
    Ты пробовала? Как минимум на gcc 5.4. Я создал dequeue, проверил конкретный элемент в контейнере, стер и затем вставил случайное число элементов впереди, конкретный элемент НЕ делает недействительным указатель конкретного элемента.
  • 0
    Но вы правы, мы не должны зависеть от усилий продавца и просто следить за документами.
1

Вставка или удаление элементов в середине делает недействительными все итераторы и ссылки.

Вставка элементов в начале/конце делает недействительными итераторы, но не влияет на ссылки.

Удаление элементов в начале/конце не влияет на итераторы или ссылки, кроме тех, которые указывают на удаленный элемент и, возможно, итератор прошедшего конца.

http://en.cppreference.com/w/cpp/container/deque/erase

Все итераторы и ссылки недействительны, если только стертые элементы не находятся в конце или в начале контейнера, и в этом случае недействительны только итераторы и ссылки на стертые элементы.

http://en.cppreference.com/w/cpp/container/deque/push_back

Все итераторы, включая итератор прошлого, недействительны. Никакие ссылки недействительны.

(другие методы, которые работают на переднем или заднем элементах, имеют похожие примечания).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню