(Лучше гуглить, написано непозволительно мало)
Стандартная библиотека шаблонов (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, просмотров: 255.