Содержание
-
Шаблоны. Стандартная библиотека шаблонов
Лекция 4
-
Понятие шаблона
Шаблон (template)– средство программирования, которое позволяет создавать функции и классы, в которых тип задается в качестве параметра. В шаблоне функции определяется алгоритм, который может применяться к данным разных типов, а конкретный тип данных передается функции в виде параметра на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному типу. Шаблоны классов обычно используются, когда класс предназначен для хранения специальным образом организованных данных и работы с ними.
-
Шаблоны функций
В простейшем случае функция-шаблон определяется так: template тип_фимя_ф(параметры) { /* тело функции */} Type – это имя фиктивного типа. Компилятор автоматически заменит его именем реального типа данных при создании конкретной версии функции. Вместо слова classможет использоваться typename. В угловых скобках указываются параметры шаблона через запятую. Их может быть несколько. Параметр может быть не только типом, но и просто переменной: template void F() {…}
-
Пример функции-шаблона
#include usingnamespacestd; template void Myswap(T &x, T &y) { T a=x; x=y; y=a; } int main() { int i=10, j=20; char s1='a', s2='b'; Myswap(i, j); cout
-
Шаблоны и перегруженные функции
Функции-шаблоны похожи на перегружаемые функции, но являются более ограниченными, т.к. всегда выполняют один и тот же алгоритм для различных типов данных. При необходимости функцию-шаблон можно перегрузить явным образом. При явной перегрузке компилятор не создает автоматическую версию функции для параметров указанных типов. Вывод: если алгоритм обработки для разных типов одинаков, используют функции-шаблоны. Если нет – перегруженные функции.
-
Пример использования шаблона и перегруженной функции
#include usingnamespacestd; #include template T Summa(T x, T y) { T S; S=x+y; return S; } char * Summa(char *s1, char *s2) { strcat(s1, s2); return s1;} int main() { float i=3.2, j=2.7; char s1[80]="Hello "; char s2[]="World!"; cout
-
Шаблоны классов
Синтаксис шаблона класса: template class имя_класса { /* описание класса*/}; Параметры перечисляются через запятую. Параметрами могут быть типы (сlass Ttype), шаблоны и переменные. Если метод описывается вне шаблона, его заголовок должен иметь вид: template возвр_типимя_класса:: имя_функции (список_параметров_функции) Создание экземпляра класса: имя_класса объект[(параметры_конструктора)]; Аргументы – значения с которым будет работать класс.
-
Пример класса-шаблона
template classMyClass{ T1 i; T2 j; public: MyClass(T1 a, T2 b) {i=a; j=b;} void Show(); }; template voidMyClass ::Show() {cout ob1(22, 3.5); MyClass ob2("text1", "text2"); ob1.Show(); ob2.Show(); return 0; }
-
Библиотека стандартных шаблонов
Стандартная библиотека С++ (Standart Template Library, STL) содержит шаблоны для хранения и обработки данных. Основные элементы библиотеки: контейнеры; итераторы; алгоритмы; функциональные объекты.
-
Контейнеры
Контейнеры – это объекты, предназначенные для хранения других однотипных объектов. Могут содержать простые объекты (целые, вещественные, символьные и т.д.), структурные данные (массивы, строки, структуры), объекты классов. Эти объекты должны допускать копирование и присваивание. В контейнерах можно хранить сами объекты или указатели на них. В каждом классе-контейнере определен набор функций для работы с этим контейнером. Для использования контейнера в программе необходимо включить в нее соответствующий заголовочный файл.
-
Классификация контейнеров
Последовательные контейнеры обеспечивают хранение конечного количества однотипных объектов в виде непрерывной последовательности. К базовым последовательным контейнерам относятся векторы (vector), списки (list) и двусторонние очереди (deque). Специализированные контейнеры (или адаптеры контейнеров) реализованы на основе базовых. Это стеки (stack), очереди (queue) и очереди с приоритетами (priority_queue. Ассоциативные контейнеры обеспечивают быстрый доступ к данным по ключу. Эти контейнеры построены на основе сбалансированных деревьев. Есть пять типов ассоциативных контейнеров: словари (map), словари с дубликатами(multimap), множества (set), множества с дубликатами (multiset) и битовые множества (bitset). 11
-
Контейнеры, определенные в STL
-
Итераторы
Итераторы – это объекты, которые по отношению к контейнерам играют роль указателей. Для всех контейнерных классов STL определен тип iterator, но его реализация в разных классах разная. Поэтому при объявлении объектов типа iterator всегда указывается область видимости: vector :: iterator i; list :: iterator j; 13
-
Основные операции с итераторами
Разыменование итератора: если р — итератор, то *р — значение объекта, на которыйон ссылается. Присваивание одного итератора другому. Сравнение итераторов на равенство и неравенство (== и !=). Перемещение его по всем элементам контейнера с помощью префиксного(++р) или постфиксного (р++) инкремента. 14
-
Просмотр элементов контейнера
Если i — некоторый итератор, то используется следующая форма цикла: for (i = first ; i != last; ++i) first— значение итератора, указывающее на первый элемент в контейнере. last— значение итератора, указывающее на воображаемый элемент, которыйследует за последним элементом контейнера. Операция сравнения для итераторов в общем случаене поддерживаются. Для всех контейнерных классов определены унифицированные методы begin() и end(), возвращающие адреса first и last соответственно. 15
-
Способы создания объекта-последовательного контейнера
1. Создать пустой контейнер: vector vec1; list list1; 2. Создать контейнер заданного размера и инициализировать его элементы значениямипо умолчанию: vector vec1(100); list list1(20); 3. Создать контейнер заданного размера и инициализировать его элементы указаннымзначением: vector vec1(100, "Hello!"); deque decl(300, -1); 16
-
4. Создать контейнер и инициализировать его элементы значениями диапазона[first, last) элементов другого контейнера: intarr[7] = {15, 2, 19,-3,28, 6,8}; vector v1(arr, arr+ 7); list lst(v1.beg() + 2, vl.end()); 5. Создать контейнер и инициализировать его элементы значениями элементовдругого однотипного контейнера: vector v1; // добавить в vlэлементы vector v2(vl); 17
-
Алгоритмы
Алгоритм – это функция, которая выполняет некоторые действия над содержимым контейнера. Чтобы использовать обобщенные алгоритмы нужно к программе подключить заголовочный файл . В списках параметров всех алгоритмов первые два параметра задают диапазонобрабатываемых элементов в виде полуинтервала [ first , last), где first— итератор,указывающий на начало диапазона, last— итератор, указывающий навыход за границы диапазона. 18
-
Пример использования векторов
#include #include #include using namespace std; int main() { double arr[] = {5.1, 2.2, 1.3, 4.4 }; intn = sizeof(arr)/sizeof(double); vector v1(arr, arr + n); // Инициализация вектора массивом vector v2; // пустой вектор vector::iterator i; for (i = v1.begin(); i != v1.end(); ++i) cout
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.