Подтвердить что ты не робот

Что такое контейнеры/адаптеры? С++

Что такое контейнеры/адаптеры?

Кто-то, пожалуйста, объясните на языке непрофессионала.

Я попытался найти в Интернете, но определения и объяснения слишком технические и трудно понять.

У меня есть базовые знания С++ и его подтемов вроде (class/templates/STL).

РЕДАКТИРОВАТЬ 1:

Кто-нибудь может дать мне практический пример применения контейнеров/адаптеров?

Просто для лучшего понимания:-)

Спасибо.

4b9b3361

Ответ 1

<joke> С++ является техническим и трудным для понимания: -D </joke>

Контейнеры представляют собой типы данных из STL, которые могут содержать данные.

Пример: vector как динамический массив

Адаптеры представляют собой типы данных из STL, которые адаптируют контейнер для предоставления определенного интерфейса.

Пример: stack обеспечение интерфейса стека над выбранным контейнером

(боковое примечание: оба являются фактически шаблонами, а не типами данных, но определение выглядит лучше)

Ответ 2

Контейнер представляет собой конкретную структуру данных, которая содержит данные, как правило, в неограниченной сумме. Каждый тип контейнера имеет ограничения по эффективному доступу, добавлению или удалению данных.

Ниже приведены несколько примеров контейнеров с использованием классов STL.

Контейнеры последовательности

Вот контейнеры последовательностей, то есть данные надежно упорядочены (т.е. есть передняя и задняя части к ним. Я НЕ имею ввиду, что они автоматически сортируют себя!).

  • A vector немного похож на массив гибкого размера. Векторы являются случайным доступом, то есть вы можете получить доступ к любому элементу с целым индексом в постоянное время (точно так же, как массив). Вы можете добавить или удалить из конца массива в (почти) постоянное время. Однако в любом другом месте, и вы, вероятно, пытаетесь восстановить потенциально все элементы.
  • A deque, или двойная очередь, похожа на вектор, но вы можете добавить его на передний или задний. Вы по-прежнему можете обращаться к элементам в постоянное время, но элементы deque не гарантируют непрерывность в памяти, таких как векторы или массивы.
  • Список - это связанный список, то есть данные, которые связаны между собой указателями. У вас есть постоянный доступ к началу и концу, но для того, чтобы добраться где-нибудь посередине, вам нужно перебирать список. Вы можете добавлять элементы в любом месте списка в постоянное время, хотя, если у вас уже есть указатель на один из ближайших узлов.

Ассоциативные контейнеры

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

  • A set - это контейнер с уникальными элементами. Вы можете добавить только один элемент в набор; любые другие дополнения игнорируются.
  • A multiset подобен набору, но вы можете поместить в него несколько элементов. Мультимножество отслеживает, сколько элементов каждого типа находится в структуре.
  • A map, также известный как ассоциативный массив, представляет собой структуру, в которую вы вставляете пары ключ-значение; то вы можете найти любое значение, предоставив ключ. Так что это немного похоже на массив, к которому вы можете получить доступ со строковым индексом (ключом) или любым другим типом индекса. (Если вы вставляете другую пару "ключ-значение" и ключ уже существует, вы просто перезаписываете значение для исходного ключа.)
  • A multimap - это карта, которая позволяет вставлять несколько значений для одного и того же ключа. Когда вы выполняете ключевой поиск, вы возвращаете контейнер со всеми значениями в нем.

Контейнерные адаптеры

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

  • A stack - это контейнер, предоставляющий доступ Last-In, First-Out (LIFO). В основном, вы удаляете элементы в обратном порядке, которые вы вставляете. Трудно добраться до любых элементов посередине. Обычно это выполняется поверх deque.
  • A queue - это контейнер, предоставляющий доступ First-In, First-Out (FIFO). Вы удаляете элементы в том же порядке, в который вы их вставляете. Трудно добраться до любых элементов посередине. Обычно это выполняется поверх deque.
  • A priority_queue - это контейнер, предоставляющий упорядоченный доступ к элементам. Вы можете вставлять элементы в любом порядке, а затем извлекать "самые низкие" из этих значений в любое время. Очереди приоритетов в С++ STL используют внутреннюю структуру кучи, которая, в свою очередь, в основном поддерживает массив; таким образом, обычно это выполняется поверх vector.

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

Ответ 3

Техническое определение "контейнер" из Документация SGI STL довольно хороша:

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

Таким образом, контейнер представляет собой структуру данных, которая содержит ( "содержит" ) коллекцию объектов некоторого типа. Основная идея заключается в том, что существуют различные типы контейнеров, каждый из которых хранит объекты по-разному и предоставляет разные характеристики производительности, но все они имеют стандартный интерфейс, так что вы можете легко менять один из них и не изменять слишком много кода, который использует контейнер. Идея состоит в том, что контейнеры разработаны как можно более взаимозаменяемые.

Контейнерные адаптеры представляют собой классы, которые предоставляют подмножество функциональных возможностей контейнера, но могут предоставлять дополнительные функции, которые облегчают использование контейнеров для определенных сценариев. Например, вы можете легко использовать std::vector или std::deque для структуры данных стека и вызвать push_back, back и pop_back в качестве интерфейса стека; std::stack предоставляет интерфейс, который может использовать контейнер std::vector или std::deque или другой последовательности, но предоставляет более стандартные функции-члены push, top и pop для доступа к элементам.