Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOAP.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
494.59 Кб
Скачать

7. Контейнерные классы

Стандартная библиотека шаблонов(STL)

К онтейнеры Итераторы Алгоритмы

Последовательный Ассоциативные

(Sequence container) (Associative container)

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

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

Итераторы – это объекты, напоминающие указатели. Они осуществляют доступ к элементам контейнера. Операции: =, разадресация (“*”), инкремент (++i , i++), == , !=.

Существует 5 видов итераторов:

  1. Итератор ввода (input_iterator_tag) – извлекает, но не хранит элементы. Перемещается только вперед.

  2. Итератор вывода (output_iterator_tag) – хранит, но не извлекает элементы. Перемещается только вперед.

  3. Прямой итератор (forward_iterator_tag) - хранит и извлекает значения. Перемещается только вперед.

  4. Двунаправленный итератор (bidirectorial_iterator_tag) – хранит и извлекает значения. Перемещается вперед и назад (поддерживает декремент).

  5. Итератор произвольного доступа (random_access_iterator_tag) – хранит и извлекает значения (поддерживает операции двунаправленного и операции сравнения). Обеспечивает произвольный доступ к элементам.

Итераторные классы и функции описаны в заголовочном файле <iterator>. Этот файл подключается автоматически при использовании стандартных контейнеров.

Итератор является недействительным, если

  • итератор не был инициализирован;

  • контейнер, с которым он связан, изменил размеры;

  • он указывает на конец последовательности.

Основные методы работы с итераторами:

  1. iterator begin() , const iterator begin() const – указывает на первый элемент контейнера.

  2. iterator end(), const iterator end() const – указывает на элемент следующий за последним.

  3. reverse_iterator rbegin() – указывает на первый элемент обратной последовательности (reverse_iteratorадаптер итератеров) .

  4. reverse_iterator rend() – указывает на элемент, следующий за последним, в обратном порядке.

Пример:

vector <int> v;

for ((vector <int>) reverse_iterator i =v.rbegin(); i != v. rend() ; ++ i )

cout << *ш << “ “;

- вывод элементов вектора в обратном направлении.

Методы общие для всех контейнерных классов:

  1. size() – количество элементов.

  2. max_size() – максимальный размер контейнера (порядка миллиарда элементов).

  3. empty() – булевская функция, указывающая пуст ли контейнер.

7.1. Векторы.

Вектор – это структура, реализующая произвольный доступ к элементам, добавление в конец и удаление из конца.

Конструкторы:

  1. explicit vector(); // конструктор по умолчанию; explicit означает, что при создании объекта запрещено неявное преобразование типа при присваивании значения другого типа;

  2. explicit vector(size_t , const T& value = T()); // создает вектор длины n и заполняет одинаковыми элементами типа T; изменение размера дорого, поэтому задание начального размера полезно;

  3. template <class initer> vector(initer first, initer last); // первый конструктор копирования (last не входит);

  4. vector (const vector<T>& x); // второй конструктор копирования.

vector <int> v4(v1);

vector <int> v2(10, 1);

vector<int> v3(v1.begin(), v1.begin() + 2);

Методы:

    1. reference operator[](size_t num ); // reference - ccылка на элемент без проверки выхода за границы;

    2. 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) {…}

    1. void push_back(const T& val); // вставка в конец;

    2. void pop_back();//удаление из конца;

    3. iterator insert(iterator position, const T& val); - так как может произойти перераспределение памяти, возвращаемое значение может отличаться от position;

    4. void insert(iterator position, size_t n, const T& val);- вставка n одинокавых элементов;

    5. template<class InIter> void insert(iterator position, InIter start, Initer end); - вставка элеметов подходящего типа, заданных диапозоном (например, из маасива);

    6. iterator erase(iterator position); - удаление одного элемента;

    7. iterator erase(iterator start, iterator end);

    8. void clear(); // очистка вектора;

    9. reference back(); // reference - ccылка на последний элемент;

    10. reference front(); // ссылка на первый элемент;

    11. size_t capacity() const; // определяет количество оперативной памяти;

    12. void reserve(size_t n); // выделение памяти для хранения n элементов;

    13. void resize(size_t n, T val = T()); // увеличение или уменьшение размера вектора; val присваивается новым значениям, вставляемым в конец вектора.

Можно сравнивать вектора, используя операции: ==, !=, <, <=, операция присваивания =. Сравнение - лексикографическое: вектора равны, если равны их размеры и попарно равны элементы.

Вектор логических значений (vector <bool>) необходим для оптимизации распределения памяти. Один элемент занимает 1 бит. Для него определен новый метод – void flip(); – инвертирование вектора.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]