Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Контейнер двухсторонней очередиСодержание книги
Поиск на нашем сайте
Двухсторонняя очередь подобна двунаправленному вектору — она наследует эффективность класса-контейнера vector по операциям последовательного чтения и записи. Но, кроме того, класс контейнер deque обеспечивает оптимизированное добавление и удаление узлов с обоих концов очереди. Эти операции реализованы аналогично классу-контейнеру list, где процесс выделения памяти запускается только для новых элементов. Эта особенность класса двухсторонней очереди устраняет потребность перераспределения целого контейнера в новую область памяти, как это приходится делать в векторном классе. Поэтому двухсторонние очереди идеально подходят для приложений, в которых вставки и удаления происходят с двух концов массива и для которых имеет важное значение последовательный доступ к элементам. Примером такого приложения может служить имитатор сборки поезда, в котором вагоны могут присоединяться к поезду с обоих концов.
Стеки
Одной из самых распространенных в программировании структур данных является стек. Однако стек не используется как независимый контейнерный класс, скорее, его можно назвать оболочкой контейнера. Шаблонный класс stack определен в файле заголовка <stack> в пространстве имен std. Стек — это непрерывный выделенный блок памяти, который может расширяться или сжиматься в хвостовой части, т.е. к элементам стека можно обращаться или удалять только с одного конца. Вы уже видели подобные характеристики в последовательных контейнерах, особенно в классах vector и deque. Фактически для реализации стека можно использовать любой последовательный контейнер, который поддерживает функции back(), push_back() и pop_back(). Большинство других методов контейнеров для работы стека не используются, поэтому они и не предоставляются классом stack. Базовый шаблонный класс stack библиотеки STL шаблона разработан для поддержания объектов любого типа. Единственное ограничение состоит в том, что все элементы должны иметь один и тот же тип. Данные в стеке организованы по принципу "последним вошел — первым вышел". Ее можно сравнить с переполненным лифтом: первый человек, вошедший в лифт, припирается к стене, а последний втиснувшийся стоит прямо у двери. Когда лифт поднимается на указанный кем-то из пассажиров этаж, тот, кто зашел последним, должен выйти первым, Если кто-нибудь (из стоящих посередине пассажиров) захочет выйти из лифта раньше других, то все, кто находится между ним и дверью, должны выйти из лифта, выпустив его, а затем вернуться обратно. Открытый конец стека называется вершиной стека, а действия, выполняемые с элементами стека, — операциями помещения (push) и выталкивания (pop) из стека. Для класса stack эти общепринятые термины остаются в силе.
Примечание: Класс stack из библиотеки STL не соответствует стекам памяти, используемым компиляторами и операционными системами, которые могут содержать объекты различных типов, хотя они работают сходным образом.
Очередь
Очередь — это еще одна распространенная в программировании структура данных. В этом случае элементы добавляются к очереди с одного конца, а вынимаются с другого. Приведем классическую аналогию. Вспомним стек. Его можно сравнить со стопкой тарелок на столе. При добавлении в стек тарелка ставится сверху всей стопки (помещение в стек), и взять тарелку из стопки (стека) можно тоже только сверху (выталкивание из стека), т.е. берется тарелка, которая была положена в стопку самой последней. Очередь же можно сравнить с любой очередью людей, например при входе в театр. Вы занимаете очередь сзади, а покидаете ее спереди. Конечно, каждому из нас приходилось стоять предпоследним в какой-нибудь очереди (например, в магазине), когда вдруг начинает работать еще одна касса, к которой подбегает стоявший за вами, что скорее напоминает стек, чем очередь. Но в компьютерах такого не случается. Подобно классу stack, класс queue реализован как класс оболочки контейнера. Контейнер должен поддерживать такие функции, как front(), back(), push_back() и pop_front().
Ассоциативные контейнеры
Тогда как последовательные контейнеры предназначены для последовательного и произвольного доступа к элементам с помощью индексов или итераторов, ассоциативные контейнеры разработаны для быстрого произвольного доступа к элементам с помощью ключей. Стандартная библиотека C++ предоставляет четыре ассоциативных контейнера: карту, мульти карту, множество и мультимножество. Карта
Вектор можно сравнить с расширенной версией массива. Он имеет все характеристики массива и ряд дополнительных возможностей. К сожалению, вектор также страдает от одного из существенных недостатков массивов: он не предоставляет возможности для произвольного доступа к элементам с помощью ключа, а лишь использует для этого индекс или итератор. Ассоциативные контейнеры как раз обеспечивают быстрый произвольный доступ, основанный на ключевых значениях. В листинге 19.10 для создания списка студентов, который мы рассматривали в листинге 19.8, используется карта. Листинг 19.10. Класс-контейнер map 1: #include <iostream> 2: #include <string> 3: #include <map> 4: using namespace std; 5: 6: class Student 7: { 8: public: 9: Student(); 10: Student(const string& name, const int age); 11: Student(const Student& rhs); 12: ~Student(); 13: 14: void SetName(const string& namе); 15: string GetName() const; 16: void SetAge(const int age); 17: int GetAge() const; 18: 19: Student& operator=(const Student& rhs); 20: 21: private: 22: string itsName; 23: int itsAge; 24: }; 25: 26: Student::Student() 27:: itsName("New Student"), itsAge(16) 28: { } 29: 30: Student::Student(const string& name, const int 31:: itsName(name), itsAge(age) 32: { } 33: 34: Student::Student(const Student& rhs) 35:: itsName(rhs.GetName()), itsAge(rhs.GetAge()) 36: { } 37: 38: Student::~Student() 39: { } 40: 41: void Student::SetName(const string& name) 42: { 43: itsName = name; 44: } 45: 46: string Student::GetName() const 47: { 48: return itsName; 49: } 50: 51: void Student::SetAge(const int age) 52: { 53: itsAge = age; 54: } 55: 56: int Student::GetAge() const 57: { 58: return itsAge; 59: } 60: 61: Student& Student::operator=(const Student& rhs) 62: { 63: itsName = rhs,GetName(); 64: itsAge = rhs.GetAge(); 65: return *this; 66: } 67: 68: ostream& operator<<(ostream& os, const Student& rhs) 69: { 70: os << rhs.GetName() << " is " << rhs.GetAge() << " years old"; 71: return os; 72: } 73: 74: template<class T, class A> 75: void ShowMap(const map<T, A>& v); // отображает свойства карты 76: 77: typedef map<string, Student> SchoolClass; 78: 79: int main() 80: { 81: Student Harry("Harry", 18); 82: Student Sally("Sally", 15); 83: Student Bill("Bill", 17); 84: Student Peter("Peter", 16); 85: 86: SchoolClassMathClass; 87: MathClass[Harry.GetName() ] = Harry; 88: MathClass[Sally.GetName()] = Sally; 89: MathClass[Bill.GetName() ] = Bill; 90: MathClass[Peter.GetName()] = Peter; 91: 92: cout << "MathClass;\n"; 93: ShowMap(MathClass); 94: 95: cout << "We know that " << MathClass["Bill"].GetName() 96: << " is " << MathClass["Bill"].GetAge() << "years old\n"; 97: 98: return 0; 99: } 100: 101: // 102: // Отображает свойства карты 103: // 104: template<class T, class A> 105: void ShowMap(const map<T, А>& v) 106: { 107: for (map<T, A>::const_iterator ci = v.begin(); 108: ci!= v.end(); ++ci) 109: cout << ci->first << ": " << ci->second << "\n"; 110: 111: cout << endl; 112: }
Результат: MathClass: Bill: Bill is 17 years old Harry: Harry is 18 years old Peter: Peter is 16 years old Saily: Sally is 15 years old We know that Bill is 17 years old
Анализ: В строке 3 в программу добавляется файл заголовка <map>, поскольку будет использоваться стандартный класс-контейнер map. Для отображения элементов карты определяется шаблонная функция ShowMap. В строке 77 класс SchoolClass определяется как карта элементов, каждый из которых состоит из пары (ключ, значение). Первая составляющая пары — это значение ключа. В нашем классе SchoolClass имена студентов используются в качестве ключевых значений, которые имеют тип string. Ключевое значение элемента в контейнере карты должно быть уникальным, т.е. никакие два элемента не могут иметь одно и то же ключевое значение. Вторая составляющая пары — фактический объект, в данном примере это объект класса Student. Парный тип данных реализован в библиотеке STL как структура (тип данных struct), состоящая из двух членов, а именно: first и second. Эти члены можно использовать для получения доступа к ключу и значению узла. Пропустим пока функцию main() и рассмотрим функцию StwtMap, которая открывает доступ к объектам карты с помощью константного итератора. Выражение ci->first (строка 109) указывает на ключ (имя студента), а выражение ci->second — на объект класса Student. В строках 81-84 создаются четыре объекта класса Student. Класс MathClass определяется как экземпляр класса SchoolClass (строка 86), а в строках 87-90 уже имеющиеся четыре студента добавляются в класс MathClass: map_object[key_value] = object_value; Для добавления в карту пары ключ—значение можно было бы также использовать функции push_back() или insert() (за более подробной информацией обратитесь к документации, прилагаемой к вашему компилятору). После добавления к карте всех объектов класса Student можно обращаться к любому из них, используя их ключевые значения. В строках 95 и 96 для считывания записи, относящейся к студенту Биллу (объекту Bill), используется выражение MathClass["Bill"].
|
||||
Последнее изменение этой страницы: 2016-12-10; просмотров: 296; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.128.171 (0.018 с.) |