
- •«Объектно-ориентированный анализ и проектирование»
- •1. Принципы ооп. Классы.
- •Описание классов.
- •Объекты класса.
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Дружественные функции и классы
- •Деструкторы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Рекомендации по составу классов
- •2. Наследование
- •Ключи доступа
- •Простое наследование
- •Пример замещения функций (практикум)
- •Виртуальные методы
- •Множественное наследование
- •3. Отношения между классами. Диаграммы класссов на языке uml.
- •4. Шаблоны классов.
- •4.1. Определения шаблонов классов Queue и QueueItem
- •4.2. Конкретизация шаблона класса
- •4.3. Аргументы шаблона для параметров-констант
- •4.4. Функции-члены шаблонов классов
- •5. Обработка исключительных ситуаций
- •5.1. Общий механизм обработки исключений.
- •5.2 . Синтаксис исключений
- •5.3. Перехват исключений
- •5.4. Исключения в конструкторах и деструкторах
- •Vector(int n) // Конструктор
- •5.5. Список исключений функции.
- •6. Строки
- •Преобразование строк
- •7. Контейнерные классы
- •7.1. Векторы.
- •7.2. Двухсторонние очереди (deque).
- •7.3. Списки (List).
- •7.4. Стеки
- •7.5. Очереди (queue)
- •7.6. Очередь с приоритетами(priority_queue)
- •8. Ассоциативные контейнеры
- •8.1. Словари (map)
- •8.2. Словари с дубликатами (multimap)
- •8.3. Множества (set)
- •8.4. Множества с дубликатами (multiset)
- •8.5. Битовые множества (bitset)
7. Контейнерные классы
Стандартная библиотека шаблонов(STL)
К
онтейнеры Итераторы Алгоритмы
Последовательный Ассоциативные
(Sequence container) (Associative container)
Контейнеры - это объекты, хранящие внутри себя другие объекты. Существует два вида контейнеров – последовательные и ассоциативные. Последовательные контейнеры организованы в виде линейного списка. Ассоциативные позволяют эффективно извлекать значения по ключу. Каждый контейнерный класс определяет набор функций, которые можно применять к контейнеру.
Алгоритмы применяются к контейнерам. Они позволяют манипулировать содержимым контейнера: инициализировать, сортировать, искать и преобразовывать содержимое контейнера. Некоторые алгоритмы применяются к диапазону элементов.
Итераторы – это объекты, напоминающие указатели. Они осуществляют доступ к элементам контейнера. Операции: =, разадресация (“*”), инкремент (++i , i++), == , !=.
Существует 5 видов итераторов:
Итератор ввода (input_iterator_tag) – извлекает, но не хранит элементы. Перемещается только вперед.
Итератор вывода (output_iterator_tag) – хранит, но не извлекает элементы. Перемещается только вперед.
Прямой итератор (forward_iterator_tag) - хранит и извлекает значения. Перемещается только вперед.
Двунаправленный итератор (bidirectorial_iterator_tag) – хранит и извлекает значения. Перемещается вперед и назад (поддерживает декремент).
Итератор произвольного доступа (random_access_iterator_tag) – хранит и извлекает значения (поддерживает операции двунаправленного и операции сравнения). Обеспечивает произвольный доступ к элементам.
Итераторные классы и функции описаны в заголовочном файле <iterator>. Этот файл подключается автоматически при использовании стандартных контейнеров.
Итератор является недействительным, если
итератор не был инициализирован;
контейнер, с которым он связан, изменил размеры;
он указывает на конец последовательности.
Основные методы работы с итераторами:
iterator begin() , const iterator begin() const – указывает на первый элемент контейнера.
iterator end(), const iterator end() const – указывает на элемент следующий за последним.
reverse_iterator rbegin() – указывает на первый элемент обратной последовательности (reverse_iterator – адаптер итератеров) .
reverse_iterator rend() – указывает на элемент, следующий за последним, в обратном порядке.
Пример:
vector <int> v;
…
for ((vector <int>) reverse_iterator i =v.rbegin(); i != v. rend() ; ++ i )
cout << *ш << “ “;
- вывод элементов вектора в обратном направлении.
Методы общие для всех контейнерных классов:
size() – количество элементов.
max_size() – максимальный размер контейнера (порядка миллиарда элементов).
empty() – булевская функция, указывающая пуст ли контейнер.
7.1. Векторы.
Вектор – это структура, реализующая произвольный доступ к элементам, добавление в конец и удаление из конца.
Конструкторы:
explicit vector(); // конструктор по умолчанию; explicit означает, что при создании объекта запрещено неявное преобразование типа при присваивании значения другого типа;
explicit vector(size_t , const T& value = T()); // создает вектор длины n и заполняет одинаковыми элементами типа T; изменение размера дорого, поэтому задание начального размера полезно;
template <class initer> vector(initer first, initer last); // первый конструктор копирования (last не входит);
vector (const vector<T>& x); // второй конструктор копирования.
vector <int> v4(v1);
vector <int> v2(10, 1);
vector<int> v3(v1.begin(), v1.begin() + 2);
Методы:
reference operator[](size_t num ); // reference - ccылка на элемент без проверки выхода за границы;
reference at(size_t num ); // reference - ccылка на элемент c проверкой выхода за границы;
Пример.
for (int i = 0; i<v.size(); i++) cout << v[i] << “ “;
try
{//…
v.at(i) = v.at(_);
}
catch(out_of_range) {…}
void push_back(const T& val); // вставка в конец;
void pop_back();//удаление из конца;
iterator insert(iterator position, const T& val); - так как может произойти перераспределение памяти, возвращаемое значение может отличаться от position;
void insert(iterator position, size_t n, const T& val);- вставка n одинокавых элементов;
template<class InIter> void insert(iterator position, InIter start, Initer end); - вставка элеметов подходящего типа, заданных диапозоном (например, из маасива);
iterator erase(iterator position); - удаление одного элемента;
iterator erase(iterator start, iterator end);
void clear(); // очистка вектора;
reference back(); // reference - ccылка на последний элемент;
reference front(); // ссылка на первый элемент;
size_t capacity() const; // определяет количество оперативной памяти;
void reserve(size_t n); // выделение памяти для хранения n элементов;
void resize(size_t n, T val = T()); // увеличение или уменьшение размера вектора; val присваивается новым значениям, вставляемым в конец вектора.
Можно сравнивать вектора, используя операции: ==, !=, <, <=, операция присваивания =. Сравнение - лексикографическое: вектора равны, если равны их размеры и попарно равны элементы.
Вектор логических значений (vector <bool>) необходим для оптимизации распределения памяти. Один элемент занимает 1 бит. Для него определен новый метод – void flip(); – инвертирование вектора.