Skip to content

Latest commit

 

History

History
225 lines (188 loc) · 11 KB

index.adoc

File metadata and controls

225 lines (188 loc) · 11 KB

Master programming.
Лекция №6 (Обзор STL)

1. Обзор языка

1.1. Основные понятия

  • Фундаментальные типы данных

  • Примитивные объекты — контейнеры

  • Стандартная библиотека шаблонов STL

  • Расширенная библиотека — Boost

  • Развитие языка — новые стандарты

  • Актуальная информация — https://cppreference.com

1.2. Стандартная библиотека шаблонов

link:images/stl.dot[role=include]

2. Структура STL

2.1. Контейнеры

  • Последовательные (vector, array, list, string)

  • Непоследовательные (list, forward_list, dequeue)

  • Ассоциативные (map, set)

  • Хеш-контейнеры (unordered_set, unordered_map)

  • Адаптеры (stack, priority_queue, queue)

  • Span (view) — C++20

  • std::initializer_list — список инициализации {1, 2, 3}

2.2. Общие методы контейнеров

  • begin/end — возвращают итераторы

  • cbegin/cend — константные итераторы (подходят только для чтения)

  • rbegin/rend — reverse_iterator (обход совершается с конца)

  • erase — удаляет элементы (освобождает место) по итератору

  • автоматические расширение контейнера при вставке

  • operator[] — индексация

  • std::find — для поиска элементов

  • size — размер контейнера

  • data — получить "сырой" указатель на данные (подходит не для всех)

  • front/back == *begin()/*rbegin()

  • push/pop/emplace/insert — вставка элементов

  • resize — изменение размера

2.3. Итераторы

  • Созданы для абстракции контейнера от алгоритма

  • 6 видов (тегов) по типам контейнеров:

    • Contigues — непрерывный (указатели)

    • RandomAccess — с произвольным доступом (vector)

    • Bidirectional — есть инкремент и декремент (list)

    • ForwardIterator — есть инкремент (forward_list)

    • Input — чтение, можно пройтись итератором только один раз (istream)

    • Output — запись, можно пройтись итератором только один раз (ostream)

  • Могут быть полностью абстрагированы от контейнера

  • Потоки ввода/вывода обладают своими итераторами

  • Адаптеры (reverse, back_inserter)

2.4. Основные методы итераторов

  • std::iterator_traits — класс для получения информации об итераторе (category_tag, value_type, reference, pointer, difference_type)

    • typename std::iterator_traits<Iterator>::value_type — тип значения при разыменовании

  • Вся арифметика построена на перегрузке операторов

  • operator()` и `operator(int) — префиксная и постфиксаня формы инкремента (декремента)

  • operator* — разыменование итератора (получение значения)

  • operator+(difference_type) — инкремент (декремент) на произвольное число

  • operator[] — индексация в RandomAccess итераторах

  • operator== и operator!= — для сравнения итераторов и остановки цикла

  • operator= — для поддержки Output итератора

  • operator- — для получения расстояния между итераторами

  • Операции — advance, distance, next, prev

2.5. Алгоритмы

  • Почти все алгоритмы работают с итераторами

  • Не модифицирующие последовательные операции (count, find)

  • Модификаторы (fill, copy, transform)

  • Сортировки (sort, nth_element, partition)

    • Поиск (binary_search, lower_bound)

    • Операции с множествами (merge, includes, set_union)

  • Минимумы/максимумы (min, minmax, min_element, clamp)

  • Аккумуляторы (iota, accumulate, transform_reduce, partial_sum, inner_product)

  • Политики запуска алгоритмов (seq, par, par_unseq)

2.6. Математические расширения

  • Общие математические функции — cmath, cstdlib

  • Специальные математические функции (cyl_bessel_i, expint, riemann_zeta)

  • Complex, valarray

  • Аккумуляторы, gcd, lcm

  • Псевдослучаные последовательности

    • Псевдогенераторы (mersenne_twister_engine, linear_congruential_engine)

    • Адаптеры генераторов (shuffle_order_engine, discard_block_engine)

    • Недетерменированный генератор (random_device)

    • Функции распределения (uniform_int_distribution, normal_distribution)

  • Рациональные числа уровня компиляции (нужно для std::chrono)

  • Управление FPE для работы с плавающей точкой

2.7. Потоковый ввод/вывод

std io complete inheritance

  • Итераторы (strembuf_iterator, stream_iterator) — InputIterator, OutputIterator

  • Потоковые объекты — stringstream

  • I/O манипуляторы

  • boost::format — самое лучшее от printf

  • boost::iostreams — расширенный std::iostream

2.8. Работа с потоками ввода/вывода

  • Копирование файла: std::ostream("blabla.txt") << std::ifstream("lala.txt").rdbuf();

  • Простейший манипулятор

    std::ostream& endline(std::ostream& s)
    {
        return s << "\n" << std::flush;
    }
    
    std::cout << "Message" << endline;
  • Как работает std::hex? Манипуляции с iword и pword потока

  • Перегрузка возможна только объекта streambuf, так как только он имеет виртуальные методы

  • Вывод вектора и написание своего оператора вывода

    template<class A, class B>
    std::ostream& operator<<(std::ostream& stream, const std::vector<A, B>& v)
    {
        std::copy(v.begin(), v.end(), std::experimental::make_ostream_joiner(stream, ", "));
    }
    
    std::vector a{{7.8, 8.0, 59.9, -9.1, 1.598, 90.35}};
    std::cout << a << std::endl;

2.9. Умные указатели

  • Обёртка на new, delete

  • Слабые указатели (weak_ptr)

  • Совместно используемые указатели (shared_ptr)

  • Уникальные указатели (unique_ptr)

  • Потокобезопасность — перегрузка оператора

  • Утилиты:

    • enable_shared_from_this

    • Умные указатели поддерживают пользовательские деструкторы

    • Аллокаторы

  • Различие delete и delete[] → умные указатели и массивы

2.10. Управление временем

  • Библиотека std::chrono

  • 3 класса для работы со временем:

    • clocks — замер времени

      • system_clock — системное время

      • steady_clock — монотонное время, никогда не возвращается назад

      • high_resolution_clock — самое точное время

      • utc_clock, file_clock, …​

    • time_point — временная метка

    • duration — разница между временными метками

  • Кастование между различными величинами duration

  • Календарь и временная зона — C++20

  • Строковые константы — 42s, 1min, 2us (C++14)

2.11. Регулярные выражения

  • https://ru.wikipedia.org/wiki/Регулярные_выражения

  • Библиотека std::regex

  • Основные функции:

    • Построение регулярки — конструктор

    • regex_match — соответствие предложения регулярному выражению

    • std::smatch, std::cmatch — объекты совпадения

    • regex_search — поиск регулярного выражения

    • regex_replace — поиск и замена

  • Строковые литералы (R"match\t\n" <=> "match\\t\\n")

  • Опции и типы регулярок — icase, multiline, ECMAScript, grep, …​

2.12. Атомарные операции

  • Сделать тип T атомарным — std::atomic<T>

  • Поддержка атомарных операций (fetch_add, exchange)

  • Барьеры памяти

  • Специальный тип atomic_flag — test_and_set

  • Для неатомарных объектов существует гарантия порядка операций std::memory_order

2.13. Потоки

  • POSIX интерфейс

  • Мьютексы:

    • mutex, timed_mutex, recursive_mutex, shared_mutex

    • Локеры — lock_guard, scoped_lock, unique_lock, shared_lock

  • Условные переменные

    • Необходимо иметь синхронизирующий мьютекс

  • Асинхронные операции:

    • promise — в него устанавливают результат асинхронно

    • future — объект, который выполнится в неизвестное время

    • async — обёртка над future

  • Объект потока std::thread

    • yield, sleep_for

    • join, detach

2.14. Работа с файловой системой

  • Отдельное подпространство имён std::filesystem

  • Класс path — абстракция пути в файловой системе

  • Методы path позволяют модифицировать путь

  • Создание директорий, символических ссылок

  • Рекурсивный обход директории — recursive_directory_iterator

  • Получение информации о файле — file_status

  • Получение доступного места на файловой системе — space_info

  • Функции для работы с файлами:

    • exists, file_size, absolute, space

    • copy_file, remove

    • rename, resize_file

    • current_path

    • temp_director_path