Контейнеры STL C++: в чем разница между deque и list?

в чем разница между ними? Я имею в виду, что все методы одинаковы. Для пользователя они работают одинаково.

Это правильно??

6 ответов


от (датированный, но все еще очень полезный)SGI STL итог deque:

deque очень похож на вектор: как и вектор, это последовательность, поддерживающая произвольный доступ к элементам, постоянную временную вставку и удаление элементов в конце последовательности и линейную временную вставку и удаление элементов в середине.

основной способ, которым deque отличается от вектора, заключается в том, что deque также поддерживает постоянное время вставка и удаление элементов в начале последовательности. Кроме того, deque не имеет функций-членов, аналогичных capacity() и reserve () вектора, и не предоставляет каких-либо гарантий достоверности итератора, связанных с этими функциями-членами.

вот резюме на list С того же сайта:

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

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


позвольте мне перечислить различия:

  • очереди управляет своими элементами с a динамический массив обеспечивает случайные доступ, и имеет почти тот же интерфейс как вектор.
  • список управляет своими элементами как a двусвязный список и не обеспечить произвольный доступ.

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

  • очереди: любая вставка или удаление элементов кроме как в начале или конце аннулирует все указатели, ссылки, и итераторы, ссылающиеся на элементы дека.
  • список: вставка и удаление элементов делает не аннулировать указатели, ссылки, и итераторы к другим элементам.

сложности

             Insert/erase at the beginning       in middle        at the end

Deque:       Amortized constant                  Linear           Amortized constant
List:        Constant                            Constant         Constant

std::list - это в основном дважды связанный список.

std::deque, С другой стороны, реализуется более как std::vector. Он имеет постоянное время доступа по индексу, а также вставку и удаление в начале и конце, что обеспечивает резко отличающиеся характеристики производительности, чем список.


нет. Deque поддерживает только O (1) вставку и удаление спереди и сзади. Например, он может быть реализован в векторе с обтеканием. Поскольку он также гарантирует O (1) случайный доступ, вы можете быть уверены, что он не использует (просто) дважды связанный список.


другой важной гарантией является то, как каждый контейнер хранит свои данные в памяти:

  • вектор представляет собой один непрерывный блок памяти.
  • a deque-это набор связанных блоков памяти, где в каждом блоке памяти хранится более одного элемента.
  • список-это набор элементов, рассеянных в памяти, т. е. на "блок"памяти хранится только один элемент.

обратите внимание, что deque был разработан для попытаться баланс преимуществ как векторные, так и без их недостатков. Это особенно интересный контейнер в памяти ограниченных платформ, например, микроконтроллеров.

стратегия хранения памяти часто упускается из виду, однако часто Это одна из самых важных причин для выбора наиболее подходящего контейнера для определенного приложения.


различия в производительности были хорошо объяснены другими. Я просто хотел добавить, что подобные или даже идентичные интерфейсы распространены в объектно-ориентированном программировании - часть общей методологии написания объектно-ориентированного программного обеспечения. Вы никоим образом не должны предполагать, что два класса работают одинаково просто потому, что они реализуют один и тот же интерфейс, так же, как вы не должны предполагать, что лошадь работает как собака, потому что они оба реализуют attack() и make_noise().