Макросы-шаблоны
План лекции
Источники информации. 5
1 Введение в стандартную библиотеку шаблонов (классов коллекций), основные понятия 6
1.1 Как STL добавилось в С++. 6
1.2 Введение в STL. 7
2 Контейнеры.. 9
2.1 Простые контейнеры.. 9
2.1.1 Пара (Pair / Tuple) 9
2.2 Контейнеры с последовательным доступом. 10
2.2.1 Вектор (vector) 10
2.2.2 Список (list) 11
2.2.3 forward_list 13
2.2.4 Очередь двухсторонняя (deque) 13
2.3 Контейнеры-адаптеры.. 13
2.3.1 Очередь односторонняя (queue) 13
2.3.2 Очередь с приоритетами (priority queue) 14
2.3.3 Стек (stack) 15
2.4 Контейнеры с доступом к случайным элементам. 15
2.4.1 Упорядоченное множество элементов (set) 15
2.4.2 multiset 16
2.4.3 Словарь (map) 16
2.4.4 multimap. 18
2.4.5 unordered_set, unordered_multiset, unordered_map, unordered_multimap 18
2.5 Другие типы контейнеров. 19
2.5.1 bitset 19
2.5.2 valarray. 19
2.6 Как работает push_back в vector. Новый метод emplace_back. 19
3 Итераторы.. 20
4 Алгоритмы.. 21
4.1 Не модифицируют коллекцию.. 21
4.1.1 all_of / any_of / none_of 22
4.1.2 for_each. 22
4.1.3 find / find_if / find_if_not / find_end / find_first_of 23
4.1.4 count / count_if 24
4.1.5 mismatch. 24
4.1.6 equal / is_permutation. 24
4.1.7 search / search_n. 24
4.2 Модифицируют коллекцию.. 24
4.2.1 copy / copy_n / copy_if / copy_backward. 24
4.2.2 move / move_backward. 25
4.2.3 swap / swap_ranges. 25
4.2.4 transform.. 25
4.2.5 replace / replace_if / replace_copy / replace_copy_if 25
4.2.6 fill / fill_n. 26
4.2.7 generate / generate_n. 26
4.2.8 remove / remove_if / remove_copy / remove_copy_if 26
4.2.9 unique / unique_copy. 26
4.2.10 reverse / reverse_copy. 26
4.2.11 rotate / rotate_copy. 26
4.2.12 shuffle / random_shuffle. 26
4.3 Расположения элементов в коллекции (партиции) 26
4.3.1 is_partioned. 26
4.3.2 partition / stable_partition / partition_copy. 26
4.3.3 partition_point 26
4.4 Сортировка. 27
4.4.1 sort / stable_sort 27
4.4.2 partial_sort / partial_sort_copy. 27
4.4.3 is_sorted / is_sorted_until 27
4.5 Бинарный поиск. 27
4.5.1 lower_bound / upper_bound. 27
4.5.2 equal_range. 27
4.5.3 binary_search. 28
4.6 Слияние (работает над отсортированными коллекциями только) 28
4.6.1 merge. 28
4.6.2 includes. 28
4.6.3 set_union / set_intersection / set_difference / set_symetric_difference 28
4.7 Управление кучей (не используются, рассматривать нет смысла) 28
4.7.1 push_heap / pop_heap / make_heap. 28
4.7.2 sort_heap. 28
4.7.3 is_heap / is_heap_until 28
4.8 min/max. 28
4.8.1 min / max / minmax. 28
4.8.2 min_element / max_element / minmax_element 28
5 Функторы, лямбда-выражения. 29
6 Будущее STL. 30
7 Наследование и работа с памятью в STL. 31
Источники информации
http://www.solarix.ru/for_developers/cpp/stl/stl.shtml http://en.wikipedia.org/wiki/Standard_Template_Library
http://ru.cppreference.com/w/cpp/container/vector
http://www.cplusplus.com/reference/algorithm/
Введение в стандартную библиотеку шаблонов (классов коллекций), основные понятия
1.1 Как STL добавилось в С++
Изначально потребность повторно использовать код классов и структур, подпрограмм покрывалась за счет копирования, затем стали использовать средства препроцессора (пример ниже), затем появились шаблоны в языке, также параллельно шла разработка библиотеки с общим функционалом. Их было много. Наиболее популярной стала STL.
Макросы-шаблоны
До появления шаблонов были макросы. Можете оценить, как генерировались уникальные имена классов и передавались аргументы.
#define LANG( cName, lName ) \
class cName \
{ \
public: \
cName()\
{ \
_langName = SET_LANG( lName ); \
_reader = new PDDefFileReader( _langName ); \
} \
~cName(){}\
\
std::string Str(){ return _langName; } \
\
private: \
PDDefFileReader* _reader; \
std::string _langName; \
}; \
С ними были проблемы: плохо отлаживать подпрограмму.
1.1.2 Появление STL в С++
В 1971 г. Дэвид Мюссер разработал некоторые концепты шаблонного программирования для вычисления алгебраических выражений.
Эту идею подхватил Степанов Александр и вместе с коллегами стал ее проталкивать как частичку языка: выпускалась масса публикаций в научных журналах на эту тему, насколько полезно обобщенное программирование.
1987. Они вместе выпустили библиотеку шаблонов для языка Ада. Потом увидели, что она не получила распространения из-за ограниченности применения Ады оборонными системами.
Затем они разработали библиотеку шаблонов для популярного языка на тот момент – С++.
1998. Впоследствии, эта библиотека была включена в С++ официально, поскольку язык в тот момент проходил стандартизацию ISO.
STL – standard template library. Стандартная библиотека шаблонов.
Также хотели отказаться от использования массивов: людей напрягало, что массивы это нечто низкоуровневое, за массивом приходится тягать его размер, работа с массивами, как присваивание, копирование, сортировка были недостаточно комфортными: это приходилось делать руками, что отнимало время, у новичков были вопросы с выходом за границы массивов (которые, как известно, в С++ молчаливо проглатываются) и удалением данных, устойчивым в том числе к исключениям. Также хотелось сделать синтаксис работы с массивами более выразительным, чтобы код было легче читать, а, стало быть, и сопровождать.
С этого момента вам воспрещается использовать массивы в коде. Только в крайних случаях. Вместо массивов используйте, например, вектор.