Библиотека стандартных шаблонов. Лекция 32

Содержание

Слайд 2

Основополагающие элементы библиотеки стандартных шаблонов (STL) Ядро библиотеки образуют три основных

Основополагающие элементы библиотеки стандартных шаблонов (STL)


Ядро библиотеки образуют три основных элемента:

контейнеры, алгоритмы и итераторы.
Контейнеры — это объекты, предназначенные для хранения других объектов. Они бывают различных типов. Например, в классе vector определяется динамический массив, в классе queue— очередь, в классе list— линейный список. В библиотеке определены также ассоциативные контейнеры, позволяющие с помощью ключей (keys) быстро получать хранящиеся в них значения. Например, в классе mар определяется ассоциативный список, где хранятся пары величин ключ/значение, что позволяет при наличии ключа получить соответствующее значение. В каждом классе-контейнере определяется набор функций для работы с ним. Так список содержит функции для вставки, удаления и слияния элементов, а в стеке имеются функции для размещения и извлечения элемента.
Слайд 3

Алгоритмы и итераторы Алгоритмы выполняют операции над содержимым контейнеров. Существуют алгоритмы

Алгоритмы и итераторы

Алгоритмы выполняют операции над содержимым контейнеров. Существуют алгоритмы для

инициализации, сортировки, поиска или замены содержимого контейнеров. Многие алгоритмы предназначены для работы с последовательностью, которая представляет собой линейный список элементов внутри контейнера.
Итераторы — это объекты, которые по отношению к контейнерам играют роль указателей. Они позволяют получать доступ к содержимому контейнера.
Слайд 4

Типы итераторов

Типы итераторов

Слайд 5

Работа с итераторами С итераторами работают так же, как с указателями.

Работа с итераторами

С итераторами работают так же, как с указателями. Можно

выполнять операции инкремента и декремента, применять оператор *. Типом итераторов - iterator.
Также поддерживаются обратные итераторы. Обратными могут быть либо двунаправленные итераторы, либо итераторы произвольного доступа, но проходящие последовательность в обратном направлении. Если обратный итератор указывает на последний элемент, то инкремент приведет к тому, что он будет указывать на перед последним.
Слайд 6

Дополнительные компоненты библиотеки У каждого контейнера имеется определенный для него распределитель

Дополнительные компоненты библиотеки

У каждого контейнера имеется определенный для него распределитель памяти

(allocator), управляющий процессом выделения памяти. По умолчанию распределителем памяти является объект класса allocator, но можно определить собственный распределитель, если нужно возложить на него необычные функции.
В некоторых алгоритмах и контейнерах используется функция, называемая предикатом. Он может быть бинарным (два аргумента) или унарным (один аргумент). Возвращаемым значением является истина или ложь. Все унарные предикаты, имеют тип UnPred, а бинарные — BinPred. Аргументы бинарного предиката расположены по порядку: первый, второй. Тип аргументов соответствует типу хранящихся в контейнере объектов. В некоторых алгоритмах и классах используется специальный тип бинарного предиката для сравнения двух элементов. Он называется функцией сравнения (возвращает истину, если первый аргумент меньше второго).
Слайд 7

Заголовочные файлы и Стандартная библиотека C++ включает заголовки и , предназначенные

Заголовочные файлы и


Стандартная библиотека C++ включает заголовки и

, предназначенные для поддержки классов-шаблонов. Например, содержит определение класса-шаблона pair (пара), в котором могут храниться пары значений.
Шаблоны из файла помогают создавать объекты, определяющие оператор-функцию operator(). Эти объекты называются объектами-функциями и во многих случаях могут использоваться вместо указателей на функцию. В файле объявлено несколько встроенных объектов-функций, некоторые из которых перечислены ниже:
plus minus multiplies divides modulus
negate equal_to not_equal_to greater greater_equal
less less_equal logical_and logical_or logical_not
Чаще всего применяется объект-функция less (меньше), которая позволяет определить, является ли значение одного объекта меньше, чем значение другого. В алгоритмах библиотеки стандартных шаблонов объектами-функциями можно заменять указатели на реальные функции, при этом библиотека будет генерировать более эффективный код.
Слайд 8

Классы-контейнеры Контейнерами называются объекты библиотеки стандартных шаблонов, непосредственно предназначенные для хранения данных.

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


Контейнерами называются объекты библиотеки стандартных шаблонов, непосредственно предназначенные для хранения данных.


Слайд 9

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

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

Слайд 10

Векторы Класс vector поддерживает динамический массив. Спецификация его шаблона имеет вид:

Векторы

Класс vector поддерживает динамический массив. Спецификация его шаблона имеет вид:
template

T, class Allocator = allocator> class vector Здесь Т - тип сохраняемых данных, a Allocator задает распределитель.
Класс vector имеет следующие конструкторы:
explicit vector(const Allocator &a = Allocator());
explicit vector(size_type num, const Т &val = T(), const Allocator &a = Allocator());
vector(const vector &ob);
template vector(InIter start, InIter end, const Allocator &a = Allocator());
Первая форма конструктора создает пустой вектор. Вторая создает вектор, который содержит num элементов со значением val. Третья создает вектор, который содержит те же элементы, что и вектор ob. Четвертая создает вектор, который содержит элементы в диапазоне, заданном параметрами start и end.
Для класса vector определены следующие операторы сравнения: ==, <, <=, !=, > и >=.
Слайд 11

Функции-члены класса vector

Функции-члены класса vector

Слайд 12

Функции-члены класса vector

Функции-члены класса vector

Слайд 13

Функции-члены класса vector

Функции-члены класса vector

Слайд 14

Функции-члены класса vector

Функции-члены класса vector

Слайд 15

Пример. Основные операции вектора #include #include using namespace std; int main

Пример. Основные операции вектора

#include
#include
using namespace std;
int main ()
{vector v;

// создание вектора нулевой длины
int i;
// вывод на экран размера исходного вектора v
cout<< "Размер = "<< v.size()<< endl;
// помещение значений в конец вектора,
for (i=0; i<10; i++) v.push_back(i);
// вывод на экран текущего размера вектора v
cout<< "Новый размер = " << v.size()<// вывод на экран содержимого вектора v
cout<< "Текущее содержимое: \n";
for(i=0; icout <
Слайд 16

Окончание примера // помещение новых значений в конец вектора, for(i=0; i

Окончание примера

// помещение новых значений в конец вектора,
for(i=0; i<10; i++) v.push_back

(i+10) ;
// вывод на экран текущего размера вектора
cout<< "Новый размер = " << v. size() <// вывод на экран содержимого вектора
cout<< "Текущее содержимое: \n";
for(i=0; icout <// изменение содержимого вектора
for(i=0; i// вывод на экран содержимого вектора
cout << "Удвоенное содержимое : \n" ;
for(i=0; icout << endl;
return 0 ;
}
Слайд 17

Пример. Вставка и удаление элементов вектора // Демонстрация функций insert() и

Пример. Вставка и удаление элементов вектора

// Демонстрация функций insert() и erase

()
#include
#include
using namespace std;
int main()
{vector v(5, 1); // создание вектора из 1
int i;
// вывод исходных размера и содержимого вектора
cout << "Размер = "<< v.size() << endl;
cout << "Исходное содержимое:\n";
for(i=0; ivector::iterator p = v.begin();
p += 2; // указывает на третий элемент
// вставка в вектор, куда указывает итератор р
//десяти новых элементов, каждый из которых равен 9
v.insert(p, 10, 9) ;
Слайд 18

Окончание программы // вывод размера и содержимого после вставки cout cout

Окончание программы

// вывод размера и содержимого после вставки
cout << "Размер после

вставки = " << v.size() << endl;
cout << "Содержимое после вставки:\n";
for(i=0; i// удаление вставленных элементов
p = v.begin () ;
p += 2; // указывает на третий элемент
v.erase(p, p+10);
//удаление 10 элементов за тем, на который указывает р
// вывод размера и содержимого после удаления
cout << "Размер после удаления — " << v.size() << endl;
cout << "Содержимое после удаления:\n";
for(i=0; icout << endl;
return 0;
}
Слайд 19

Списки Класс list поддерживает двунаправленный линейный список. В отличии от вектора,

Списки

Класс list поддерживает двунаправленный линейный список. В отличии от вектора, в

котором реализован произвольный доступ, к элементам списка доступ может быть только последовательным. Поскольку списки являются двунаправленными, доступ к элементам списка возможен с обеих его сторон. Спецификация шаблона для класса list:
template> class list
Здесь Т — это тип данных, предназначенных для хранения в списке, а ключевое слово Allocator задает распределитель памяти, который по умолчанию является стандартным.
Слайд 20

Конструкторы класса list explicit list(const Allocator &a = Allocator()); explicit list

Конструкторы класса list

explicit list(const Allocator &a = Allocator());
explicit list (size_type

число, const Т &значение = T(),
const Allocator &a = Allocator());
list (const list&объект);
templatelist (Inlter начало, Inlter конец,
const Allocator &a = Allocator());
Первая форма представляет собой конструктор пустого списка.
Вторая форма — конструктор списка, число элементов которого — это число, а каждый элемент равен значению значение, которое может быть значением по умолчанию.
Третья форма конструктора предназначена для списка из одинаковых элементов, каждый из которых — это объект. Четвертая форма — это конструктор списка, содержащего диапазон элементов, заданный итераторами начало и конец.
Для класса list определяются операторы сравнения:
==, <, <=, !=, >, >=
Слайд 21

Функции класса list

Функции класса list

Слайд 22

Функции класса list

Функции класса list

Слайд 23

Функции класса list

Функции класса list

Слайд 24

Функции класса list

Функции класса list

Слайд 25

Функции класса list

Функции класса list

Слайд 26

Функции класса list

Функции класса list

Слайд 27

Пример. Основные операции списка #include #include using namespace std; int main()

Пример. Основные операции списка

#include
#include
using namespace std;
int main()
{list lst;

// создание пустого списка
int i;
for (i=0; i<10; i++) lst.push_back('A' + i);
cout << "Размер = " << lst. size () << endl;
list::iterator p;
cout << "Содержимое: ";
while(!lst.empty()) {p = lst.begin(); cout<< *p;
lst.pop_front();}
return 0;
}
Слайд 28

Ассоциативные списки Класс mар поддерживает ассоциативный контейнер, в котором каждому значению

Ассоциативные списки

Класс mар поддерживает ассоциативный контейнер, в котором каждому значению соответствует

уникальный ключ. После того как значение помещено в контейнер, извлечь его оттуда можно с помощью ключа. В ассоциативном списке можно хранить только уникальные ключи. Дублирования ключей не допускается. Для создания ассоциативного списка с неуникальными ключами используется класс-контейнер multimap.
Слайд 29

Шаблон для класса mар template class Comp = less , class

Шаблон для класса mар

templateclass Comp = less,


class Allocator=allocator> class map
Key — это данные типа ключ, Т — тип данных, предназначенных для хранения, Comp - функция для сравнения двух ключей, которой по умолчанию является стандартная объект-функция less(), Ключевое слово Allocator задает распределитель памяти (которым по умолчанию является allocator
Слайд 30

Конструкторы класса mар explicit map (const Comp &ф_сравн = Соmр(), const

Конструкторы класса mар

explicit map (const Comp &ф_сравн = Соmр(),
const Allocator &a

= Allocator());
map (const map &объект);
template map(InIter начало, InIter конец,
const Comp &ф_сравн = Comp(), const Allocator &a = Allocator());
Первая форма представляет конструктор пустого ассоциативного списка. Вторая форма предназначена для ассоциативного списка из одинаковых элементов, каждый из которых — это объект. Третья форма — это конструктор ассоциативного списка, содержащего диапазон элементов, заданный итераторами начало и конец. Функция сравнения ф_сравн, если она присутствует, задает порядок сортировки элементов ассоциативного списка.
Слайд 31

Иллюстрация возможностей ассоциативного списка #include #include using namespace std; int main()

Иллюстрация возможностей ассоциативного списка

#include
#include
using namespace std;
int main()
{map m;
int

i ;
// размещение пар в ассоциативном списке
for(i=0; i<10; i++) {m.insert(pair('A' + i, i) );}
char ch;
cout << "Введите ключ: ";
cin >> ch;
map:: iterator p;
// поиск значения по заданному ключу
p = m. find(ch) ;
if (p != m.end() )
cout << p->second;
else cout << "Такого ключа в ассоциативном списке нет\n";
return 0;}
Слайд 32

Функции класса mар

Функции класса mар

Слайд 33

Функции класса mар

Функции класса mар

Слайд 34

Функции класса mар

Функции класса mар