Основы STL. Структура и назначение. Контейнеры
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

(Лучше гуглить, написано непозволительно мало)

Стандартная библиотека шаблонов (STL) содержит набор шаблонов, представляющих контейнеры, итераторы, функциональные объекты и алгоритмы.

В библиотеке выделяют пять основных компонентов:

• Контейнер (container) хранение набора объектов в памяти. Контейнеры являются однородными, то есть могут содержать значения только одинакового типа.

• Итератор (iterator) обеспечение средств доступа к содержимому контейнера.

Итераторы представляют собой объекты, позволяющие передвигаться по объекту-контейнеру так же, как обычные указатели позволяют передвигаться по массиву; они являются обобщением

указателей.

• Алгоритм (algorithm) определение вычислительной процедуры.

• Адаптер (adaptor) адаптация компонентов для обеспечения различного интерфейса.

• Функциональный объект (functor) сокрытие функции в объекте для использования другими компонентами.

 

 

Контейнеры библиотеки STL можно разделить на четыре категории:

• Последовательные

vector

list

deque

 

• Ассоциативные

set

multiset

map

multimap

 

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

stack

queue

priority_queue

 

• Псевдоконтейнеры

Bitset

 

 

SDL. Аллокаторы / Итераторы

(Надо смотреть в лекциях!!!)

Аллокатор – специальный класс(шаблон), отвечающий за выделение памяти и конструирование объектов. Содержит методы

- для выделения памяти под n объектов

- освобождения памяти по указателю, выделенной под n объектов

-создания экземпляра объекта в заданном месте памяти

-удаления экземпляра объекта в данном месте памяти

(Вынесли этот функционал из вектора по принципу единственности ответственности + возможность специализировать аллокатор для нужного нам типа по своему)

 

Итератор – класс, обеспечивающий доступ к элементам, содержащимся в контейнере в определенном порядке (должен поддерживать разыменование, оба инкремента и проверку на равенство)

Возможности итераторов:

-Все:

-оператор и конструктор копирования

-движение вперед

-Для чтения

-однократное чтение (корректность повторного разыменования итератора не гарантируется)

-сравнение итераторов

- (*iter).m ó iter->m

-Для записи:

-однократная запись (аналогично см. чтение)

-для однопроходных алгоритмов (файл открыли, прошли, всё, назад низя)

-Прямой:

-гарантируется корректность повторного чтения и записи

-Двунаправленный:

-все возможности прямого

-движение назад

-реализован в map, list, set

-Произвольного доступа:

-все возможности двунаправленного

-поддерживает +=, -= числа, +, -, [] (как указатели)

-вычитание (если они над одной последовательностью), возвращает расстояние

-сравнение

-реализован в vector, deque

 

 (Всякая ерунда)

Модули в C++

С целью оптимизации процесса разработки и борьбы со сложностью системы абстракций, программы на C++ разбиваются на модули (исходные файлы – единицы компиляции “.cc” и “.cpp”)

Каждый файл может содержать объявления и определения элементов программы (переменных, функций, структур и классов, шаблонов, определений типа typedef, пространств имен и т.д.)

Каждый элемент имеет свой тип связи (linkage):

· no linkage (для элементов на стеке)

· internal linkage (область видимости – файл)

· external linkage (область видимости – проект)

 

Классические перечислимые типы (enum)

enum Color { RED, YELLOW, WHITE };

Каждое значение элемента перечисления приводится к целому типу явное задание значений: enum Color { RED = 10, ...};

· диапазон значений перечисления:

· если n – максимальное возможное значение

· m – минимальное при котором 2^m - 1 >= n

 

· 2^m - 1 - максимальное значение элемента

· если наименьшее значение отрицательно, то берется -2^m + 1

· enum { min =-10, max = 1000} // -1024 : 1024

 

 

Типы данных

❑ Целочисленные:

· int d = 42; //десятичные

· int o = 052; //восьмеричные

· int x = 0x2a; //шестнадцатеричные

· int X = 0X2A; // шестнадцатеричные

· int b = 0b101010; // двоичные

 

Область определения и видимости

· Локальные переменные скрывают глобальные и определенные вне блока

· для доступа к глобальным можно использовать оператор разрешения видимости ::

· доступ к скрытым локальным переменным невозможен

◼ Глобальные переменные инициализируются значением по умолчанию (0 для большинства типов: char, int, float, double, указателей)

◼ Локальные переменные не инициализируются по умолчанию и должны быть проинициализированы

 

 

Rvalue и lvalue

Допускается выделять память и «использовать

переменные», у которых нет имен, а также присваивать значения странно выглядящим выражениям: *p[a+10] = 10

 

· Вводится понятие «что-то в памяти» - это и есть lvalue – то, что может стоять слева от знака присваивания. Т.е. lvalue – это выражение, ссылающееся на объект в памяти или функцию.

· rvalue – это выражение, которое имеет значение и может стоять справа от знака присваивания. Lvalue может быть автоматически преобразовано в rvalue

· присвоить значение lvalue ссылающемуся на константу – нельзя (lvalue, которое не было объявлено константой называют модифицируемым lvalue).

 

CV квалификаторы

Переменные могут быть в своем объявлении содержать CV квалификаторы (const, volatile)

 

Существуют следующие варианты CV квалификации переменной типа T (кроме void):

· const T var; // константа

· volatile T var; // volatile объект

· const volatile T var; // константный volatile объект

❑ const объект не может быть изменен

❑ volatile служит для запрещения оптимизации)

❑ для снятия CV используется const_cast<T>

 

Typedef & using:

typedef unsigned int uint;

using uint = unsigned int;

 

 

Существуютм четыре категории преобразования типов:

❑ static_cast<T>() – тоже что и (T)

❑ dynamic_cast<T>() – используется для указателей и ссылок на полиморфные типы

❑ const_cast<T> – снятие CV

❑ reinterpret_cast<T> – реинтерпретация участка памяти

 

Дата: 2019-02-19, просмотров: 231.