Standard Template Library часть 2

Содержание

Слайд 2

Двусторонние очереди - deque

Двусторонняя очередь – последовательный контейнер, который поддерживает:
произвольный доступ к

Двусторонние очереди - deque Двусторонняя очередь – последовательный контейнер, который поддерживает: произвольный
элементам, как у vector
эффективную вставку и удаление с обоих концов за постоянное время
Распределение памяти выполняется автоматически.

Слайд 3

Принцип организации двусторонней очереди

Очередь разбита на блоки, доступ к которым осуществляется через

Принцип организации двусторонней очереди Очередь разбита на блоки, доступ к которым осуществляется
массив указателей.
При добавлении в начало или конец выделяется память под соответствующий блок.
При выходе за границу массива указателей память перераспределяется под него так, чтобы использовались средние элементы (не занимает много времени).
Произвольный доступ к элементам – за константу, но медленнее, чем у vector

Закрашенная область блоков - занятые элементы
Не закрашенная – свободные элементы

Слайд 4

Конструкторы создания двусторонней очереди

По умолчанию
explicit deque();
С заполнением n одинаковыми значениями, равными value
explicit

Конструкторы создания двусторонней очереди По умолчанию explicit deque(); С заполнением n одинаковыми
deque(size_type n,
const T& value = T());
С заполнением значениями из другого контейнера с использованием диапазона итераторов [first, last)
explicit deque(InputIter first,
InputIter last);
Конструктор копирования
deque(const deque& x);

Слайд 5

Прочие методы аналогичны vector

Операция присваивания =, метод присвоения assign
Операция произвольного доступа к

Прочие методы аналогичны vector Операция присваивания =, метод присвоения assign Операция произвольного
элементам [], метод доступа at
Методы получения итераторов begin, end, rbegin, rend
Метод вставки insert, метод добавления в конец push_back, удаления из конца pop_back, добавления в начало push_front, удаления из начала pop_front
Метод удаления erase, очистки clear
Метод получения количества элементов size, изменения количества resize

Слайд 6

Пример использования двусторонней очереди

deque d;
for (int i = 0; i < 5;

Пример использования двусторонней очереди deque d; for (int i = 0; i
i++)
{
d.push_back(i * i);
d.push_front(i * i * i);
}
for (deque::iterator i = d.begin(); i != d.end(); i++)
cout << *i << " ";

Слайд 7

Двусвязный список - list

Двусвязный список не предоставляет быстрого произвольного доступа к элементам,

Двусвязный список - list Двусвязный список не предоставляет быстрого произвольного доступа к
но реализует эффективно операции вставки и удаления.
Отсюда для итераторов:
++, -- выполняются за постоянное время
+k, -k – за время, пропорциональное k

Слайд 8

Основные методы двусвязного списка (I)

Получение первого элемента
T& front();
Получение последнего элемента
T& back();
Методы добавления

Основные методы двусвязного списка (I) Получение первого элемента T& front(); Получение последнего
и удаления в начало и конец
void push_front(const& T value);
void pop_front();
void push_back(const& T value);
void pop_back();
Получение и изменение размера
size_type size();
void resize(size_type sz);

Слайд 9

Основные методы двусвязного списка (II)

Методы изменения списка
iterator insert(iterator pos,
const T& value);

Основные методы двусвязного списка (II) Методы изменения списка iterator insert(iterator pos, const
void insert(iterator pos,int n,
const T& value);
void insert(iterator pos,
InputIter first,
InputIter last);
iterator erase(iterator pos);
iterator erase(iterator first,
iterator last);
void swap(list& x);
void clear();

Слайд 10

Основные методы двусвязного списка (II)

Методы сцепки списков – служат для перемещения элементов

Основные методы двусвязного списка (II) Методы сцепки списков – служат для перемещения
из одного списка в другой без перераспределения памяти, только за счет изменения указателей
Перенос всех элементов x перед pos
void splice(iterator pos, list& x);
Перенос одного элемента из x, на который указывает i в позицию перед pos
void splice(iterator pos, list& x,
iterator i);
Перенос всех элементов x из диапазона [first, last)
void splice(iterator pos, list& x,
iterator first,
iterator last);

Слайд 11

Основные методы двусвязного списка (III)

Методы удаления элементов
По значению элемента (удаляются все вхождения)
void

Основные методы двусвязного списка (III) Методы удаления элементов По значению элемента (удаляются
remove(const& T value);
По условию, задаваемому предикатом
void remove_if(Predicate pred);
Методы упорядочивания элементов
По возрастанию (для T должна быть определена операция <)
void sort();
С помощью функционального объекта сравнения (см. примеры для priority_queue)
void sort(Compare comp);

Слайд 12

Основные методы двусвязного списка (IV)

Методы удаления дубликатов элементов в отсортированном списке
При наличии

Основные методы двусвязного списка (IV) Методы удаления дубликатов элементов в отсортированном списке
операции ==, определенной для T
void unique();
С помощью бинарного предиката, возвращающего значение типа bool (истина ⬄ два элемента равны)
void unique(BinaryPredicate pred);
Метод слияния упорядоченных списков
void merge(list& x, Compare comp);
Метод изменения порядка элементов на обратный
void reverse();

Слайд 13

Пример использования двусвязного списка

//Шаблонная функция печати элементов списка
template
ostream& operator<< (ostream&

Пример использования двусвязного списка //Шаблонная функция печати элементов списка template ostream& operator
out, const list& l) {
for (list::const_iterator i = l.begin(); i != l.end(); i++)
out << *i << " ";
cout << endl;
return out;
}
…….
list l;
for (int i = 0; i < 20; i++)
l.push_back(rand() % 10);
cout << "Random list : " << l;
l.remove(0);
cout << "After remove(0) : " << l;
l.sort();
cout << "After sort : " << l;
l.unique();
cout << "After unique : " << l;

Слайд 14

Cтеки - stack

Стек – не самостоятельный контейнер, он является адаптером одного из

Cтеки - stack Стек – не самостоятельный контейнер, он является адаптером одного
существующих контейнеров (vector, deque, list).
По умолчанию – deque.

Слайд 15

Реализация стека в STL

template >
class stack

Реализация стека в STL template > class stack { protected: Container c;
{
protected:
Container c;
public:
explicit stack(const Container& _c = Container()) { c = _c; }
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
T& top() { return c.back(); }
void push(const T& x) { c.push_back(x); }
void pop() { c.pop_back(); }
};

Слайд 16

Пример использования стека

stack st;
for (int i = 0; i < 10; i++)
st.push(i);
cout

Пример использования стека stack st; for (int i = 0; i st.push(i);
<< "stack size = " << st.size() << endl;
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}

Слайд 17

Очереди - queue

Очередь – не самостоятельный контейнер, он является адаптером одного из

Очереди - queue Очередь – не самостоятельный контейнер, он является адаптером одного
существующих контейнеров (deque, list).
По умолчанию – deque.
vector не подходит, т.к. нет операции удаления из начала.

Слайд 18

Реализация очереди в STL

template >
class queue{
protected:
Container

Реализация очереди в STL template > class queue{ protected: Container c; public:
c;
public:
explicit queue(const Container& _c = Container()) { c = _c; }
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
T& front() { return c.front(); }
T& back() { return c.back(); }
void push(const T& x) { c.push_back(x); }
void pop() { c.pop_front(); }
};

Слайд 19

Пример использования очереди

queue q;
for (int i = 0; i < 10; i++)
q.push(i);
cout

Пример использования очереди queue q; for (int i = 0; i q.push(i);
<< “queue size = " << q.size() << endl;
cout << "last element = " << q.back() << endl;
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}

Слайд 20

Очереди с приоритетами – priority_queue

Очередь с приоритетами – очередь, в которой каждому

Очереди с приоритетами – priority_queue Очередь с приоритетами – очередь, в которой
элементу соответствует приоритет, определяющий порядок выборки из очереди.
По умолчанию порядок определяется операцией < - из очереди выбирается максимальный элемент.
priority_queue – адаптер контейнера с произвольным доступом к элементам, например, vector или deque (по умолчанию – vector).

Слайд 21

Реализация очереди с приоритетами в STL

template ,

Реализация очереди с приоритетами в STL template , class Compare = less
class Compare = less >
class priority_queue{
protected:
Container c;
Compare comp;
public:
explicit priority_queue(const Compare& _comp = Compare(), const Container& _c = Container());
priority_queue(InputIter first, InputIter last, const Compare& _comp = Compare(), const Container& _c = Container());
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
T& top() { return c.front(); }
void push(const T& x);
void pop();
};

Слайд 22

Функциональные объекты сравнения (Бинарные предикаты)

Параметр Compare является функциональным объектом, задающим операцию сравнения

Функциональные объекты сравнения (Бинарные предикаты) Параметр Compare является функциональным объектом, задающим операцию
на меньше. Можно задать стандартные значения:
less<тип> - сравнение на меньше
greater<тип> - сравнение на больше
less_equal<тип> - сравнение на меньше или равно
greater_equal<тип> - сравнение на больше или равно
Данные стандартные функциональные объекты определены в заголовочном файле

Слайд 23

Очереди с приоритетами и функциональные объекты

По умолчанию в priority_queue используется функциональный объект

Очереди с приоритетами и функциональные объекты По умолчанию в priority_queue используется функциональный
less, который требует, чтобы у типа T была реализована операция <.
При необходимости можно реализовать собственный функциональный объект сравнения, в нем должна быть определена операция () с двумя параметрами (сравниваемыми объектами) результат сравнения (тип bool) истина ⬄ первый параметр меньше второго

Слайд 24

Пример использования очереди с приоритетами и реализованной собственной операцией < - сравнение

Пример использования очереди с приоритетами и реализованной собственной операцией class Rectangle {
прямоугольников по площади (I)

class Rectangle
{
public:
double A, B;
Rectangle(double _A = 0.0, double _B = 0.0) : A(_A), B(_B) {}
double getArea() const { return A * B; };
bool operator < (const Rectangle& x) const {
return getArea() < x.getArea();
}
};

Слайд 25

Пример использования очереди с приоритетами и реализованной собственной операцией < - сравнение

Пример использования очереди с приоритетами и реализованной собственной операцией priority_queue q; q.push(Rectangle(1.0,
прямоугольников по площади (II)

priority_queue q;
q.push(Rectangle(1.0, 1.0));
q.push(Rectangle(3.0, 10.0));
q.push(Rectangle(2.0, 5.0));
q.push(Rectangle(10.0, 10.0));
while (!q.empty())
{
cout << q.top().A << " " << q.top().B << endl;
q.pop();
}

Слайд 26

Пример использования очереди с приоритетами и собственным функциональным объектом сравнения

……//Определение класса Rectangle

Пример использования очереди с приоритетами и собственным функциональным объектом сравнения ……//Определение класса
идет выше
class RectangleCompare {
public:
bool operator() (const Rectangle& x, const Rectangle& y)
{
return x.getArea() < y.getArea();
}
};
……
priority_queue,RectangleCompare> q;
…… //далее идет использование q
Имя файла: Standard-Template-Library-часть-2.pptx
Количество просмотров: 153
Количество скачиваний: 1