|
Программирование >> Дополнительные возможности наследования
Контвйнвр двухстороннвй очврвуи Двухсторонняя очередь подобна двунаправленному вектору - она наследует эффективность класса-контейнера vector по операциям последовательного чтения и записи. Но, кроме того, класс контейнер deque обеспечивает оптимизированное добавление и удаление узлов с обоих концов очереди. Эти операции реализованы аналогично классу-контейнеру list, где процесс вьщеления памяти запускается только для новых элементов. Эта особенность класса двухсторонней очереди устраняет потребность перераспределения целого контейнера в новую область памяти, как это приходится делать в векторном классе. Поэтому двухсторонние очереди идеально подходят для приложений, в которых вставки и удаления происходят с двух концов массива и для которых имеет важное значение последовательный доступ к элементам. Примером такого приложения может служить имитатор сборки поезда, в котором вагоны могут присоединяться к поезду с обоих концов. Стеки Одной из самых распространенных в программировании структур данных является стек. Однако стек не используется как независимый контейнерный класс, скорее, его можно назвать оболочкой контейнера. Шаблонный класс stack определен в файле заголовка <stack> в пространстве имен std. Стек - это непрерывный выделенный блок памяти, который может расширяться или сжиматься в хвостовой части, т.е. к элементам стека можно обращаться или удалять только с одного конца. Вы уже видели подобные характеристики в последовательных контейнерах, особенно в классах vector и deque. Фактически для реализации стека можно использовать любой последовательный контейнер, который поддерживает функции ЬаскО, push back() и рор Ьаск(). Больщинство других методов контейнеров для работы стека не используются, поэтому они и не предоставляются классом stack. Базовый шаблонный класс stack библиотеки STL шаблона разработан для поддержания объектов любого типа. Единственное ограничение состоит в том, что все элементы должны иметь один и тот же тип. Данные в стеке организованы по принципу последним вошел - первым вышел . Ее можно сравнить с переполненным лифтом: первый человек, вошедший в лифт, припирается к стене, а последний втиснувшийся стоит прямо у двери. Когда лифт поднимается на указанный кем-то из пассажиров этаж, тот, кто зашел последним, должен выйти первым. Если кто-нибудь (из стоящих посередине пассажиров) захочет выйти из лифта раньше других, то все, кто находится между ним и дверью, должны выйти из лифта, выпустив его, а затем вернуться обратно. Открытый конец стека называется вершиной стека, а действия, выполняемые с элементами стека, - операциями помещения (push) и выталкивания (pop) из стека. Для класса stack эти общепринятые термины остаются в силе. Класс stack из библиотеки STL не соответствует стекам памяти, используемым компиляторами и операционными системами, которые могут содержать объекты различных типов, хотя они работают сходным образом. Очередь Очередь - это еще одна распространенная в профаммировании сфуктура данных. В этом случае элементы добавляются к очереди с одного конца, а вынимаются с другого. Приведем классическую аналогию. Вспомним стек. Его можно сравнить со стопкой тарелок на столе. При добавлении в стек тарелка ставится сверху всей стопки (помещение в стек), и взять тарелку из стопки (стека) можно тоже только сверху (выталкивание из стека), т.е. берется тарелка, которая была положена ш стопку самой последней. Очередь же можно сравнить с любой очередью людей, например при входе в теаф. Вы занимаете очередь сзади, а покидаете ее спереди. Конечно, каждому из нас приходилось стоять предпоследним в какой-нибудь очереди (например, в магазине), когда вдруг начинает работать еще одна касса, к которой подбегает стоявший за вами, что скорее напоминает стек, чем очередь. Но в компьютерах такого не случается. Подобно классу stack, класс queue реализован как класс оболочки контейнера. Контейнер должен поддерживать такие функции, как front(), back(), push back() и pop front(). Ассоциативные контейнеры Тогда как последовательные контейнеры предназначены для последовательного и произвольного доступа к элементам с помощью индексов или итераторов, ассоциативные контейнеры разработаны для бысфого произвольного доступа к элементам с помощью ключей. Стандартная библиотека С++ предоставляет четыре ассоциативных контейнера: карту, мультикарту, множество и мультимножество. Карта Вектор можно сравнить с расширенной версией массива. Он имеет все характеристики массива и ряд дополнительных возможностей. К сожалению, вектор также Сфадает от одного из существенных недостатков массивов: он не предоставляет возможности для произвольного доступа к элементам с помощью ключа, а лишь использует для этого индекс или итератор. Ассоциативные контейнеры как раз обеспечивают быстрый произвольный доступ, основанный на ключевых значениях. В листинге 19.10 для создания списка студентов, который мы рассматривали в листинге 19.8, используется карта. Aucmuuz 13.10. КАассконтейиер тар
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 StudentO; void SetName(const string& name); string GetNameO const; void SetAge(const int age); int GetAgeO const; Students, operator=(const Student& rhs); private: string itsName; int itsAge; Student: :Student() : itsNameCNew Student ), itsAge(16) Student::Student(const string& name, const int age) : itsName(name), itsAge(age) { } Student::Student(const Student& rhs) : itsName(rhs.GetName()), itsAge(rhs.GetAge()) Student:: Student() void Student::SetName(const string& name) { itsName = name; string Student::GetName() const { return itsName; void Student::SetAge(const int age) { ItsAge = age; int Student::GetAge() const { return itsAge; Students Student::operator=(const Students rhs) {
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |