acm_stl_lecture.ppt
- Количество слайдов: 23
Контейнеры STL Библиотека algorithm Фичи C++11
1. Контейнеры
std: : pair Представляет собой пару значений произвольных типов Создается как pair<type 1, type 2> p Доступ к элементам — p. first и p. second Можно создать пару функцией make_pair()
std: : vector Представляет собой массив переменного размера Реализует произвольный доступ и последовательное итерирование Может расти (теоретически) неограниченно
Полезные методы std: : vector front() - досуп к первому элементу back() - доступ к последнему элементу push_back(T value) - вставка в конец empty() - проверка на пустоту size() - возвращает размер insert(iterator pos, T value) — вставка в указанную позицию erase(iterator first [, iterator last]) — удаление одного (или набора) элементов clear() - очистка всего контейнера
std: : string Строка символов динамического размера Можно работать как с char[]-строками Можно использовать в функциях, ожидающих char
Полезные методы std: : string empty() size(), length() append(), operator+= replace() substr(pos, count) find(string s)
std: : set Неповторяющееся отсортированное множество элементов
Полезные методы std: : set empty() size() insert(key) erase(iterator pos[, iterator last]) find(key) lower_bound(key) upper_bound(key)
std: : map Хеш, он же ассоциативный массив, он же словарь Хранит пары вида «ключ — значение» Сортирует по ключу Ключи уникальны Можно обращаться по ключу, используя [ ] Существует также unordered_map
Полезные методы std: : map empty() size() find(key) lower_bound(key) upper_bound(key) insert(pair)
2. Библиотека algorithm
<algorithm> Содержит множество полезных вспомогательных функций Большинство функций работают с контейнерами, в частности, со всеми, описанными выше
Итераторы Объект, предоставляющий возможность проходить (итерировать) по элементам набора (контейнера) Итератор для вектора int'ов будет выглядеть так: vector<int>: : iterator it Существуют два стандартных метода — begin() и end(), которые возвращают итераторы начала и «за последним» элементом, соответственно. Итераторы поддерживают сложение и вычитание с целыми числами, инкремент и декремент. Например, it + n позволяет передвинуть итератор вперед на n позиций Элемент можно получить операцией *it, его методы — it->
std: : sort Принимает аргументы: итератор начала коллекции, итератор конца (здесь и далее «конец» - следующий за последним элемент, итератор end), [функцию-компаратор] Сортирует содержимое контейнера алгоритмом quick sort (за O(n * log n)) Для элементов должна быть определена операция сравнения или функциякомпаратор
Компараторы Функция, принимающая два аргумента одного типа, и возвращающая bool Возвращает true, если элементы стоят в правильном порядке, и flase — если их нужно переставить местами Передается третьим параметром (необязательно) в функцию сортировки
std: : reverse(begin, end) — переворачивает последовательность std: : unique(begin, end) — удаляет все повторения элеменов последовательности std: : count(begin, end, value) — возвращет количество вхождений элемента value в последовательность std: : find(begin, end, value) — находит указанный элемент в последовательности. Рабоает за O(n)
Функции бинарного поиска Работают с отсортированными последовательностями за O(log n) binary_search(begin, end, value) — возвращает bool, проверяет наличие элемента в последовательности lower_bound(begin, end, value) — возвращает итератор на первый элемент >= value upper_bound(begin, end, value) — возвращает итератор на первый элемент > value equal_range(begin, end, value) — возвращает пару итераторов, обозначающих границы подпоследовательности искомых значений
3. С++11
Тип auto Упрощает работу с длинными названиями типов С++03: vector<pair<int, float> > v; vector<pair<int, float> >: : iterator it = v. begin(); C++11: vector<pair<int, float> > v; auto it = v. begin();
Range-based циклы Для итерации по наборам данных можно использовать новый синтаксис цикла for: vector<int> v; v. push_back(1); v. push_back(5); v. push_back(3); for(auto el: v) cout << el << endl; int a[] = {5, 16, 21, 45}; for(int e: a) cout << endl;
Источники и мануалы по API C++ http: //www. cplus. com/reference/ http: //ru. cppreference. com
Асимптотика и О-нотация Время работы программы зависит от входящих параметров и используемых алгоритмов. По крайней мере, у нас. Вычислительная сложность записывается как функция от ключевых параметров Цикл по n элементов будет работать O(n) времени Цикл по матрице m*n — О(n*m) Вычисление суммы арифметической прогрессии всегда работает одинаковое время — O(1) — константная асимптотика Допустимая сложность наших задач — около 10^7, предельная — около 10^9, но не всегда
acm_stl_lecture.ppt