213d00549485064e54a7bb46a7acb4c8.ppt
- Количество слайдов: 29
Составные типы данных Прикладное программирование кафедра прикладной и компьютерной оптики
2 Составные типы данных Гомогенные Назначение для хранения однотипных переменных Пример массив, строка, список, стек, очередь, набор, карта, дерево Гетерогенные для хранения неоднородных разнотипных переменных структура, класс
3 Массивы Массив - это группа последовательных ячеек памяти, имеющих один и тот же тип int data[4]; Нумерация элементов – от 0 до <размер-1> data[0]=1; data[1]=2; data[2]=3; data[3]=4; Объявление и инициализация double v[3]={0. 3, 2. 2, 2. }; char symbols[]={'a', 'b', 'c', 'd', 'e'};
4 Динамическое размещение массива double *data; // указатель на массив data=new double[1000]; // указатель на 0 -й элемент массива // инициализация for(int i=0; i<1000; i++) { data[i]=0. ; } delete [] data; // обязательно освободить память data+1; // указатель на 1 -й элемент data+100; // указатель на 100 -й элемент, *(data+4); // эквивалентно data[4] См. пример программы
5 Передача массива в функцию может осуществляться только по указателю на нулевой элемент, с дополнительной информацией о количестве элементов в массиве // указатель на массив + количество элементов в массиве double sum(double* m, int n) // или double m[] { double s=0. ; for(int i=0; i
6 Двумерный массив Для создания двумерного массива необходимо указать в квадратных скобках два значения – количество строк и столбцов в массиве double matrix[3][2]; // двумерный массив 2 х3 double sum=0. ; for(int i=0; i<3; i++) // номер строки { for(int j=0; j<2; j++) // номер столбца { sum+=matrix[i][j]; } } [0][0] [0][1] [1][0] [1][1] [2][0] [2][1] matrix[0][0]; matrix[2][1]; [0][0] [0][1] [1][0] [1][1] [2][0] [2][1]
7 Динамическое размещение двумерного массива Двумерный массив можно разместить динамически, только если представить его как одномерный n вместо доступа по индексам [i][j], придется вычислять индекс одномерного массива, которому будет соответствовать необходимый элемент двумерного массива • Например, элементу [1][0] двумерного массива будет соответствовать индекс [2] одномерного массива // указатель на двумерный массив matrix[3][2] double *matrix=new double[3*2]; // matrix[i][j] matrix[i*2+j]=0. ; // например matrix[1][0] matrix[1*2+0]=0. ; 0 1 2 3 4 5 [0][0] [0][1] [1][0] [1][1] [2][0] [2][1] delete [] matrix; //освободить память См. пример программы
8 Контейнеры Контейнер – тип данных, предназначенный для хранения однотипных данных n вектор, стек, очередь, список, ассоциативный массив, дерево Хранение элементов контейнера n n последовательно (непрерывным блоком) разбросаны по всей памяти Доступ к элементам контейнера n n по индексу только последовательным перебором
9 STL (Standard Template Library) – стандартная библиотека шаблонов Контейнеры n объекты для хранения однотипных данных: • последовательные (vector, deque, list); • ассоциативные (set, multiset, map, multimap); Адапторы n объекты, созданные на основе базовых контейнеров, с измененным интерфейсом (например, queue, stack) Итераторы n объекты, которые используются для универсального доступа к элементам хранящимся в контейнере любого типа Алгоритмы n обобщенные процедуры для обработки элементов любых контейнеров Функции-объекты n объекты, у которых перегружен оператор вызова функций
10 Контейнеры: вектор, стек, очередь Вектор n n хранение элементов единым блоком доступ к любому элементу по индексу Стек n n хранение элементов единым блоком доступ только к последнему элементу, внесенному в стек Очередь n n хранение элементов единым блоком доступ только к первому элементу, внесенному в очередь
11 Контейнеры: список, дерево, ассоциативный массив Список n элементы разбросаны по памяти • каждый элемент содержит указатель на последующий и предыдущий n только перебор Дерево n n элементы разбросаны по памяти обхода дерева от корня • родитель содержит ссылки на дочерние элементы Ассоциативный массив n n элементы разбросаны по памяти обход дерева по ключу
12 Вектор - одномерный массив проиндексированных элементов • Доступ к функциям вектора производится через оператор ". " • Подробнее о классах и шаблонах см. главу 4 и раздел 5. 4. #include
13 Функции работы с вектором Размер (количество элементов) контейнера int n=x. size(); Изменение размера контейнера x. resize(100); Доступ к элементам контейнера x[i]=5; Добавить элемент в конец контейнера • Добавляет копию элемента x. push_back(7); Определяет пустой ли контейнер bool res=x. empty(); // эквивалентно x. size() == 0 Очистить контейнер • разрушает все элементы и освобождает контейнер x. clear(); Выделение дополнительной памяти для размещения новых эл-в x. reserve(200); Определяет кол-во элементов, для которых зарезервирована. память int n=x. capacity(); Остальные функции – см. Приложение 5 См. пример программы
14 Список – структура данных для организации хранения элементов с эффективной вставкой и удаления в любом месте этой структуры, не требует доступа по индексу n УЗЕЛ (Node) – объект, который содержит ссылки на последующий и предыдущий элементы, а также значение данного элемента списка Простой односвязный список Простой двухсвязный список Кольцевой двухсвязный список
15 Функции списка STL – простой двухсвязный список list
ls;" src="https://present5.com/presentation/213d00549485064e54a7bb46a7acb4c8/image-16.jpg" alt="16 Итераторы Итератор – это обобщённый "указатель" на элемент, хранящийся в контейнере list
17 Использование итераторов list
18 Двусторонняя очередь (deque) Двусторонняя очередь – последовательность, которая: n n n поддерживает произвольный доступ к элементам (аналогично vector) поддерживает вставку и удаление в начало последовательности Кроме того: • не имеет функций-членов capacity() и reserve() • не предоставляет никаких гарантий на допустимость итератора См. пример программы
19 Стек (stack) Стек – адаптер очереди, который организует ее работу по правилу "last in, first out" (LIFO) n n не предоставляет функций для получения итераторов и их перебора позволяет проверить, какой элемент находится на вершине стека (top) stack
20 Очередь (queue) Очередь – это адаптер очереди, который организует ее работу по правилу "first in, first out" (FIFO) n n не предоставляет функций для получения итераторов и их перебора позволяет проверить, какой элемент находится на вершине стека (front) queue
21 Ассоциативный массив - используется для хранения связанных пар "ключ-значение" ("key-value") n n массив, в котором индекс может быть не целочисленного типа организуются как сбалансированное дерево узлов pair
22 Ассоциативный массив map Доступ к элементам по ключу map
23 Ассоциативный массив set Доступ к элементам по итератору n все значения уникальны и отсортированы • от меньшего ключа к большему ключу set
24 Алгоритмы – обобщенные процедуры для обработки элементов любых контейнеров #include
25 Алгоритмы не модифицирующие контейнер – процедуры поиска и сравнения list
26 Алгоритмы модифицирующие значение элементов контейнера, но не изменяющие порядок их следования – выполнение действий над каждым элементом контейнера, поиск и замена vector
27 Алгоритмы модифицирующие контейнер – функции копирования, перестановок, удаления, тасования и сортировки, разбиения и слияния последовательностей vector
28 Функции-помощники (перестановки и сравнения) vector
29 Численные алгоритмы #include


