Разница между контейнерами последовательностей и адаптерами контейнеров в c ++ - PullRequest
4 голосов
/ 09 сентября 2011

В чем разница между контейнерами последовательностей и адаптерами контейнеров в c ++?

Здесь я имею в виду контейнеры последовательности как векторы, deque, list, а адаптеры контейнеров как стек, очередь, priority_queue. Когда мы предпочитаем контейнеры последовательности и адаптеры контейнеров?

Ответы [ 4 ]

3 голосов
/ 09 сентября 2011

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

Предположим, вы просто использовали один из контейнеров последовательности непосредственно для реализации очереди. Вы вызываете push_front для добавления в очередь, pop_back для удаления из нее. Теперь приходит сопровождающий Бозо и звонит pop_front вместо pop_back. Если вы не хотите, чтобы кто-то вставлял неправильный конец того, что вы собираетесь использовать в качестве очереди или стека, не предоставляйте эту функциональность. Адаптеры контейнера преднамеренно не обеспечивают полный доступ к базовому контейнеру последовательности.

С другой стороны, если вам нужно попасть под капот (например, вам нужно взглянуть на второй элемент в стеке), вам понадобится использовать контейнер последовательности вместо адаптера. Возможно, вы захотите использовать философию адаптера: не экспортируйте полную функциональность контейнера. Просто экспортируйте функциональность, которая действительно необходима.

3 голосов
/ 09 сентября 2011

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

Адаптер контейнера вообще не является контейнером, поскольку он не реализует интерфейс контейнера (непредоставить итератор и т. д.).Вместо этого он предоставляет ограниченный доступ к контейнеру.Те, что предусмотрены в стандартной библиотеке, работают с использованием последовательности.

Адаптер контейнера используется, когда требуется ограниченный доступ к коллекции объектов.И стек, и очередь позволяют добавлять только на одном конце.Кроме того, стек позволяет только читать / удалять на том же конце, в который вы пишете, а очередь позволяет только читать / удалять на противоположном конце.Они не делают ничего, чего не делает последовательность, за исключением , за исключением для остановки итерации по всем элементам и т. Д. Поведение

priority_queue немного сложнее, и это делаетдобавить поведение, которое еще не является частью последовательности.

2 голосов
/ 09 сентября 2011

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

Контейнер последовательности можно увидеть как контейнеры, «созданные с нуля».Они используют различные структуры для хранения данных и имеют различное алгоритмическое время для вставки, удаления и извлечения элемента.

Вы можете найти много информации об алгоритмическом времени контейнеров здесь

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

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

Самое главное во всем этом - убедиться, что вы используете нужный контейнер, соответствующий вашим потребностям.,Более строгий контейнер поможет вам предотвратить неправильное использование данных, а знание использования ваших данных поможет вам выбрать хороший контейнер для получения наилучших характеристик.

Более подробную информацию о контейнерах можно найти здесь здесь

Что я должен использовать большую часть времени?

Многие эксперты (Скотт Мейер, Бьярн Страуструп) предлагают использовать vector по умолчанию, в то время как другие (например, Херб Саттер в качестве Стива)Джессоп указал) предложить deque.Я настоятельно рекомендую вам выбрать контейнер, который наилучшим образом соответствует вашим потребностям.

2 голосов
/ 09 сентября 2011

Вы должны использовать адаптер стекового контейнера, когда вам нужен стек, адаптер очереди, когда вам нужна очередь, и адаптер priority_queue, когда вам нужна очередь с приоритетами.

Если вы не уверены, когданужны они: стек увеличивается и уменьшается на одном конце, так что вы можете использовать его в качестве аккумулятора для хранения промежуточных результатов (стековая машина);использовать очередь для обработки данных по принципу «первым пришел - первым обслужен» (FIFO);очередь с приоритетами извлекает элементы в определенном порядке (например, сохраняет задачи, затем извлекает их в порядке важности).

...