C++ deque vs vector и C++ map vs Set

может кто-нибудь, пожалуйста, скажите мне, в чем разница между vector vs deque. Я знаю реализацию vector в C++, но не deque. Также мне кажутся похожими интерфейсы map и set. В чем разница между этими двумя и когда использовать один.

4 ответов


std:: vector: класс динамического массива. Внутреннее выделение памяти гарантирует, что оно всегда создает массив. Полезно, когда размер данных известен и, как известно, не меняется слишком часто. Это также хорошо, когда вы хотите иметь случайный доступ к элементам.
std:: deque: двусторонняя очередь, может выступать в качестве стека или очереди. Хорошо, когда вы не уверены в количестве элементов и при доступе к элементу данных всегда в серийном порядке. Они быстры, когда элементы добавляются / удаляются спереди и сзади, но не тогда, когда они добавляются/удаляются в/из середины.
std:: list: список с двойной связью, который можно использовать для создания "списка" данных. Преимущество списка заключается в том, что элементы могут быть вставлены или удалены из любой части списка, не затрагивая итератор, указывающий на член списка (и все еще является членом списка после удаления). Полезно, когда вы знаете эти элементы будут очень часто удаляться из любой части списка.
std:: map: словарь, который сопоставляет "ключ" со "значением". Полезно для таких приложений, как "массивы", индекс которых не является целым числом. В основном может использоваться для создания списка карт имени элемента, например карты, которая хранит отношение "имя-виджет".
std:: set: список уникальных значений данных. Например, если вы вставляете 1, 2, 2, 1, 3, в списке будут только элементы 1, 2, 3. Обратите внимание, что элементы в этом списке всегда заказывали. Внутри они обычно реализуются как деревья двоичного поиска (например, map).


см. здесь для получения полной информации:

каковы гарантии сложности стандартных контейнеров?

вектор против очереди

a deque совпадает с вектором, но со следующим добавлением:

  • это "передняя последовательность вставки"

Это означает, что deque совпадает с вектором, но предоставляет следующие дополнительные гарантии:

  • push_front() O (1)
  • pop_front () O (1)

установить Vs map

карта является "парным ассоциативным контейнером", а set - "простым ассоциативным контейнером"

Это означает, что они точно такие же. Разница в том, что карта содержит пары элементов (ключ/значение), а не только значение.


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

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

Я предлагаю вам взглянуть на ссылку в нем будет подробно рассказано о том, каковы эти гарантии. Scott Meyers book "Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library" должен немного рассказать об этом, если я правильно помню. Кроме того, стандарт C++, очевидно, является хорошим выбором.

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


set: содержит уникальные значения. Поставьте " а "дважды, в наборе будет одна "а". карта: отображает ключи к значениям, например " имя "= > "Фред", "возраст" = > 40. Вы можете найти "имя", и вы получите "Фред".

dequeue, как вектор, но вы можете добавлять/удалять только на концах. Никаких вставок в середину. http://en.wikipedia.org/wiki/Deque

edit: мое описание dequeue отсутствует, см. комментарии ниже для исправлений