Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Догнать и перегнать boost::lexical_castRoman Orlov
Разбор нестандартной реализации преобразования целого числа в строку без использования циклов и рекурсивных вызовов времени исполнения - только рекурсия на этапе компиляции
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Догнать и перегнать boost::lexical_castRoman Orlov
Разбор нестандартной реализации преобразования целого числа в строку без использования циклов и рекурсивных вызовов времени исполнения - только рекурсия на этапе компиляции
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
После этого доклада вы будете знать, что такое Handlersocket, нужен ли он вам и «как его готовить».
Все как обычно — грабли, шишки, слезы из реальной жизни, направления «куда копать», примеры из практики. Вместе с докладом Сергей выложит код самописного php-клиента для HS, который мы используем в Badoo.
Всё о статическом анализе кода для Java программистаAndrey Karpov
Этот доклад для тех, кто не знаком со статическими анализаторами кода, или знаком, но ещё не внедрил эти инструменты в процесс разработки. Будет описана методология статического анализа и как она используется для выявления ошибок и запахов кода. Будут кратко рассмотрены некоторые популярные инструменты статического анализа для языка Java, а также платформа SonarQube способная объединить и визуализировать отчёты различных анализаторов. Немного заглянем внутрь и поговорим о технологиях, используемых в современных статических анализаторах кода и позволяющих находить разнообразнейшие паттерны ошибок. Затронем вопрос, почему несмотря на уже существующие инструменты наша команда решила сделать ещё один: PVS-Studio for Java :). В конце рассмотрим важный вопрос интеграции инструментов статического анализа в большие старые проекты и почему так важно регулярное использование подобных инструментов.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Мы уже около 3-х лет используем HandlerSocket в нашей инфраструктуре сайта badoo.com. За это время мы накопили опыт решения характерных для Handlersocket проблем, появляющихся при использовании.
Несколько команд внутри Баду активно используют HS для решения разноплановых задач мобильных и настольных приложений Баду. Где-то мы используем HS как замену Memcached, где-то как простой поисковый механизм, где-то как хранилище типа ключ-значение. Наш HS-кластер содержит более 30 серверов, обрабатывая порядка 8000 запросов/сек.
Я также предоставлю написанный мной код библиотеки-клиента для Handlersocket на PHP.
Про что доклад:
* что это вообще такое;
* чем является HS и чем не является;
* внутреннее устройство и работа HS;
* протокол;
* примеры использования в Баду, с цифрами и графиками;
* особенности: шардирование, Percona Server, постоянные соединения (бенефиты, проблемы и их решения), tips & tricks;
полезные сслыки, ответы на FAQ.
Доклад рассчитан на highload-разработчиков, работающих с реляционными БД.
Сложность: выше среднего.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Проектирование Программных Систем. Лекция 01Dima Dzuba
Лекция рассказывает о базовых принципах построения программного обеспечения. Проводится сравнение гибких (Agile) и водопадных методологий разработки программного обеспечения.
2. template
alias
Example69_TemplateAlias
1.template <class A,class B> class Pair {
2. public:
3. A a;
4. B b;
5. Pair(A v1,B v2) : a(v1), b(v2) {};
6.};
7.template <class A> using SamePair = Pair<A,A>;
8.int main(int argc, char** argv) {
9. Pair<int,const char*> a(1,"one");
10. SamePair<int> b(2,2);
11.
12. return 0;
13.}
3. Книга
про
шаблоны
Год
выпуска:
2002
Автор:
Андрей
Александреску
Жанр:
Программирование
[C++]
Издательство:
Издательский
дом
"Вильямс"
Москва
-‐ Санкт-‐
Петербург
-‐ Киев
ISBN:
5-‐8459-‐0351-‐3(рус),
0-‐201-‐77581-‐6(англ.)
Количество
страниц: 326
Описание:
В
книге
изложена
новая
технология
программирования,
представляющая
собой
сплав
обобщённого
программирования
шаблонов
и
объектно -‐ ориентированного
программирования
на
С++.
Обобщённые
компоненты,
созданные
автором,
высоко
подняли
уровень
абстракции,
наделив
язык
С++
чертами
языка
спецификации
проектирования,
сохранив
всю
его
мощь
и
выразительность
В
книге
изложены
способы
реализации
основных
шаблонов
проектирования.
Разные
компоненты
воплощены
в
библиотеке
Loki,
которую
можно
загрузить
с
Web-‐страницы
автора.
Книга
предназначена
для
опытных
программистов
на
С++
5. STL
1. Входит
в
поставку
стандартных
C++
компиляторов
2. Содержит
контейнеры,
структуры
данных,
итераторы
и
алгоритмы
3. Спецификация
находится
тут:
http://www.cplusplus.com/reference
6. Контейнеры
Контейнер — это
объект,
который
может
содержать
в
себе
другие
объекты.
Существует
несколько
разных
типов
контейнеров.
Например,
класс
vector определяет
динамический
массив,
deque создает
двунаправленную
очередь,
а
list представляет
связный
список.
Эти
контейнерыназываются
последовательными
контейнерами(sequence containers),
потому
что
в
терминологии
STL
последовательность
— это
линейный
список.
STL
также
определяет
ассоциативные
контейнеры (associative containers),
которые
обеспечивают
эффективное
извлечение
значений
на
основе
ключей.
Таким
образом,
ассоциативные
контейнерыхранят
пары
“ключ/значение”.
Примером
может
служить
map.
Этот
контейнер хранит
пары
“ключ/значение”,
в
которых
каждый
ключ
является
уникальным.
Это
облегчает
извлечение
значения
по
заданному
ключу.
7. Виды
контейнеров
Контейнер Описание Требуемый
заголовок
deque Двунаправленная
очередь <deque>
list Линейный
список <list>
map Хранит
пары
«ключ/значение»,
где
каждый
ключ
ассоциирован
только
с
одним
значением
<map>
bitset Битовое
поле
— это
массив
битов
фиксированного
размера <bitset>
multiset Множество,
в
котором
каждый
элемент
не
обязательно
уникален
<set>
priority_queue Очередь
с
приоритетами <deque>
queue Очередь <deque>
set Множество
уникальных
элементов <set>
stack Стек <stack>
vector Динамический
массив <vector>
8. Операции,
поддерживаемые
контейнерами
Все
контейнерыдолжны
поддерживать
операцию
присваивания.
Они
должны
также
поддерживать
все
логические
операции.
Другими
словами,
все
контейнерыдолжны
под-‐
держиватьследующие
операции:
=,==,<,<=,!=,>,>=
Все
контейнерыдолжны
иметь
конструктор,
создающий
пустой
контейнер,
и
конструктор
копирования.
Они
должны
предусматривать
деструктор,
который
освобождает
всю
память,
использованную
контейнером,
и
вызывать
деструктор
каждого
элемента
в
контейнере.
9. Итераторы
Одной
из
основных
парадигм
данной
библиотеки
было
разделение
двух
сущностей:
контейнеров
и
алгоритмов.
Но
для
непосредственного
воздействия
алгоритмом
на
данные
контейнера
пришлось
ввести
промежуточную
сущность
— итератор.
Итераторы
позволили
алгоритмам
получать
доступ
к
данным,
содержащимся
в
контейнере,
независимо
от
типа
контейнера.
Но
для
этого
в
каждом
контейнере
потребовалось
определить
класс
итератора.
Таким
образом
алгоритмы
воздействуют
на
данные
через
итераторы,
которые
знают
о
внутреннем
представлении
контейнера.
10. Что
нового
в
C++:
range-‐based циклы
Example64_RangeFor
В
С++11
была
добавлена
поддержка
парадигмыforeach для
итерации
по
набору.
В
новой
форме
возможно
выполнять
итерации
в
случае,
если
для
объекта
итерации
перегружены
методы begin() и end().
Данный
циклы
не
работают
с
массивами,
аллоцируемыми динамически
(т.к.
про
них
компилятор
не
знает,
какой
у
них
будет
размер).
А
вот
с
такими
работает:
int arr[] = { 1, 2, 3, 4, 5 };
for (auto e : arr)
std::cout << e << std::endl;
11. Простейший
итератор
для
RangeFor
Example65_Iterator
// for работает с итератором как с указателем!
1.class IntIterator{
2.int operator*() ;
3.int operator->();
4.bool operator!=(IntIterator const& other)
const;
5.IntIterator & operator++() ;
6.}
13. Методы
контейнеров
Все
контейнерыдолжны
предоставлять
перечисленные
ниже
функции.
iterator
begin()
Возвращает
итератор,
указывающий
на
первый
элемент
контейнера.
const_iterator begin()
const Возвращает
константный
итератор,
указывающий
на
первый
элемент
контейнера.
iterator
end()
Возвращает
итератор,
указывающий
на
позицию,
сле-‐ дующую
за
последним
элементом
контейнера.
const_iterator end()
const Возвращает
константный
итератор,
указывающий
на
по-‐
зицию,
следующую
за
последним
элементом
контейнера.
bool empty()
const Возвращает true,
если контейнер пуст.
size_type size()
const Возвращает
количество
элементов,
в
текущий
момент
хранящихся
в
контейнере.
void
swap(ContainerType c)
Обменивает
между
собой
содержимое
двух
контейнеров.
14. Требования
к
последовательному
контейнеру
void
clear() Удаляет
все
элементы
из
контейнера.
iterator
erase(iterator
i)
Удаляет
элемент,
на
который
указывает
i.
Возвращает
итератор,
указывающий
на
элемент,
находящийся после
удаленного.
iterator
erase(iterator
start,
iterator
end)
Удаляет
элементы
в
диапазоне,
указанном
start и
end.
Возвращает
итератор,
указывающий
на
элемент,
нахо-‐ дящийся после
последнего
удаленного.
iterator
insert(iterator
i,
const
T
&val)
Вставляет
val непосредственно
перед
элементом,
спе-‐
цифицированным i.
Возвращает
итератор,
указываю-‐ щий
на
вставленный
элемент.
void
insert(iterator
i,
size_type
num,
const T
&val)
Вставляет
num копий
val непосредственно
перед
эле-‐ ментом,
специфицированным
i.
template
<class
InIter>
void
insert(iterator
i,
InIter start,
InIter end)
Вставляет
последовательность,
определенную
start и
end,
непосредственно
перед
элементом,
специфициро-‐ ванным
i.
15. std::vector
#include <vector>
1. Эквивалент массива
с
динамическим
размером
2. Параметры
шаблона:
template < class T, class Alloc = allocator<T> > class vector;
3. Итерваторы:
1. begin,
end
– обычные
(cbegin,
cend – константные)
2. rbegin,
rend
– revers
итераторы
(crbegin,
crend – константные)
4. Доступ
к
элементам:
[size_t]
,
at(size_t)
5. Модификаторы:
1. push_back,
pop_back –добавление/удаление
элемента
в
конец
2. insert
– добавление
элемента
в
произвольную
точку
16. Пример
Example70_vector
1.// vector размера 5 заполненыый int со значением 100
2. std::vector<int> v(5, 100);
3.// печать всех элементов
4. for (int i : v) std::cout << i << std::endl;
5.// итератор для вектора
6.std::vector<int>::iterator it;
7.// удаляем элементы равные 100
8. for (it = v.begin(); it != v.end();) {
9. if (*it == 100) // значение элемента на итераторе
10. v.erase(it); // удаление элемента
11. else it++; // сдвиг итератора
12. };
17. std::map
#include <map>
1. Используются
для
создания
«словарей»,
т.е.
пар
ключ-‐
значение.
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
2. Основное
назначение
– поиск
значений
по
ключу.
Делается
это
с
помощью
std::pair< map::key_type, map::mapped_type>
operator[](map::key_type)
3. В
pair
есть
два
атрибута– first
и
second
4. pair
описан
в
#include<utility>
18. Пример
Example71_map
1.// пара строка – целое число
2.std::map<const char*,int> age;
3.// добавляем или меняем значение
4.age["Иванов"] = 18;
5.// явное добавление
6.age.insert(std::pair<const char*,int>("Петров",21);
7.// удаляем значение
8.age.erase("Петров");
9.// печатаем на экран с помощью итератора
10.for(auto value:age)
11.std::cout << "Age of " <<value.first << "=" << value.second << std::endl;
19. std::deque
Example79_Deque
1.std::deque<std::string> myDeque; // создаем пустой дек типа string
2.myDeque.push_back(std::string("World ")); // добавили в дек один элемент типа
string
3.std::cout << "Количество элементов в деке: " << myDeque.size() << std::endl;
4.myDeque.push_front("Hello "); // добавили в начало дека еще один элемент
5.myDeque.push_back(" !!!"); // добавили в конец дека элемент
6.std::cout << "Количество элементов в деке изменилось, теперь оно = " <<
7. myDeque.size() << std::endl;
8.std::cout << "nВведенный дек: ";
9. for(auto i:myDeque) std::cout << i << " ";
10.myDeque.pop_front(); // удалили первый элемент
11.myDeque.pop_back(); // удалили второй элемент
20. std::set
Example80_Set
1.#include <iostream>
2.#include <set> // заголовочный файл множеств и мультимножеств
3.#include <iterator>
4.int main(){
5.std::set<char> mySet; // объявили пустое множество
6.// добавляем элементы в множество
7.mySet.insert('I’);
8.// печатаем
9.for( auto i: mySet) std::cout << i << " ";
10.std::cout << std::endl;
11.// удаляем i
12.mySet.erase('i');
13.// ищем I
14. if(mySet.find('I')!=mySet.end()) std::cout << "Found I" << std::endl;
15.return 0;
16.}
23. Итераторы
в
<vector>
1. Это
объект,
который
указывает
на
элемент
в
структуре
данных
и
позволяет
перебирать
элементы
этой
структуры
данных.
Фактически
он
действует
как
указатель
на
элемент
массива.
2. Для
вектора
он
выглядел
так:
std::vector<int>::iterator it;
3. Доступ
к
элементам
мы
осуществляли:*it;
4. Смещение
по
итератору
производили
it++, it--;
24. Итератор
Контейнер может иметь произвольную структуру и различные методы
доступа:
Итератор указывает на элемент
контейнера и знает как перейти
к следующему элементу
Программе работает только с
итератором и его интерфейсом
(++)
26. std::back_insert_iterator
Example72_back_insert_iterator
1.std::vector<int> foo, bar;
2. for (int i = 1; i <= 5; i++) {
3. foo.push_back(i);
4. bar.push_back(i * 10);
5. }
6.// итератор добавляющй элементы в конец foo
7.std::back_insert_iterator< std::vector<int> > back_it(foo);
8.// копируем из bar в back_it
9.std::copy(bar.begin(), bar.end(), back_it);
28. Семантика
перемещения (std::move)
Example77_move
Основная
идея
в
том,
что
если
вы
получается
в
конструкторе
копирования
или
в
операторе
копирования
Rvalue ссылку,
то
мы
должны
переместить
ее
содержимое
внутрь
нашего
объекта.
Это
и
есть
семантика
перемещения.
Если
получаем
Lvalue ссылку,то мы
копируем
значение.
Поддержка
семантики
перемещения
– обязанность
самого
объекта!
Упрощенно
std::move
выглядит
так:
template <class T> T&& move(T& value) { return
static_cast<T&&> (value);}
30. Итераторы
-‐ итого
1. Итераторы
– хранят
ссылку
на
контейнер
и
даже
на
определенный
элемент
в
контейнере
2. Итераторы
– знают
о
структуре
контейнера
3. Итераторы
– предоставляют
однотипный
интерфейс
по
доступу
к
любому
контейнеру
4. Итераторы
– могут
не
только
получать
данные
из
контейнера,
но
могут
записывать
данные
в
контейнер
(зависит
от
структуры
контейнера)
31. Интересные
алгоритмы
1.#include <algorithm>
2. Sort
a
vector:
std::sort(vec.begin(), vec.end());
3. Reverse
a
vector:
std::reverse(vec.begin(), vec.end());
4. Min/Max:
std::min(3,1) == 1 ; std::max(3,1) == 3
5. //
много
всего
на
http://cplusplus.com/
33. Аллокаторы
Каждый
контейнер имеет
определенный
для
него
аллокатор (allocator).
Аллокатор управляет
выделением
памяти
для
контейнера.
Аллокатором по
умолчанию
является
объект
класса
allocator,
но
вы
можете
определять
свои
собственные
аллокаторы,
если
это
необходимо
для
специализированных
приложений.
Для
большинства
применений
аллокатора по
умолчанию
вполне
достаточно.
34. Классическая
история
-‐ ресторан
Предположим
у
нас
есть
суши
ресторан.
У
нас
есть
стол
и
места,
размещенные
вокруг.
В
наши
обязанности
входит
размещение
посетителей
за
столом.
35. Назначаем
места
посетителям
Заходит
компания
их
трёх
человек
и
просит
показать
им
места.
Довольный
приходом
посетителей,
ты
любезно
их
усаживаешь.
Не
успевают
они
присесть
и
положить
себе
немного
суши,
как
дверь
снова
открывается,
и
заходят
ещё
четверо!
Ресторан
теперь
выглядит
так…
36. Через
некоторое
время
И
тут
приходят
четыре
человека
и
просят
усадить
их.
Прагматичный
по
натуре,
ты
тщательно
отслеживал,
сколько
осталось
свободных
мест,
и
смотри,
сегодня
твой
день,
четыре
места
есть!
Есть
одно
«но»:
эти
четверо
жутко
социальные
и
ходят
сидеть
рядом.
Ты
отчаянно
оглядываешься,
но
хоть
у
тебя
и
есть
четыре
свободных
места,
усадить
эту
компанию
рядом
ты
не
можешь!
Просить
уже
имеющихся
посетителей
подвинуться
посреди
обеда
было
бы
грубовато,
поэтому,
к
сожалению,
у
тебя
нет
другого
выбора,
кроме
как
дать
новым
от
ворот
поворот,
и
они,
возможно,
никогда
не
вернутся.
Всё
это
ужасно
печально.
37. Динамическое
выделение
памяти
1. malloc и
new пытаются
быть
всем
в
одном
флаконе
для
всех
программистов...
Они
выделят
вам
несколько
байтов
ровно
тем
же
способом,
что
и
несколько
мегабайтов.
Уних нет
той
более
широкой
картины,
которая
есть
у
программистов.
2. Относительно
плохая
производительность...
Стоимость
операций
free или
delete в
некоторых
схемах
выделения
памяти
также
может
быть
высокой,
так
как
во
многих
случаях
делается
много
дополнительной
работы
для
того,
чтобы
попытаться
улучшить
состояние
кучи
перед
последующими
размещениями.
«Дополнительная
работа»
является
довольно
расплывчатым
термином,
но
она
может
означать
объединение
блоков
памяти,
а
в
некоторых
случаях
может
означать
проход
всего
списка
областей
памяти,
выделенной
вашему
приложению!
3. Они
являются
причиной
фрагментации
кучи...
4. Плохая
локальность
ссылок...
В
сущности,
нет
никакого
способа
узнать,
где
та
память,
которую
вернёт
вам
malloc или
new,
будет
находиться
по
отношению
к
другим
областям
памяти
в
вашем
приложении.
Это
может
привести
к
тому,
что
у
нас
будет
больше
дорогостоящих
промахов
в
кеше,
чем
нам
нужно,
и
мы
в
концов
будем
танцевать
в
памяти
как
на
углях.
38. Перегрузка
операторов
new
и
delete
Example74_OperatorNew
Операторы
new и
delete можно
перегрузить.
Для
этого
есть
несколько
причин:
◦ Можно
увеличить
производительность
за
счёт
кеширования:
при
удалении
объекта
не
освобождать
память,
а
сохранять
указатели
на
свободные
блоки,
используя
их
для
вновь
конструируемых
объектов.
◦ Можно
выделять
память
сразу
под
несколько
объектов.
◦ Можно
реализовать
собственный
"сборщик
мусора"
(garbage collector).
◦ Можно
вести
лог
выделения/освобождения
памяти.
Операторы
new и
delete имеют
следующие
сигнатуры:
void *operator new(size_t size);
void operator delete(void *p);
Оператор
new принимает
размер
памяти,
которую
необходимо
выделить,
и
возвращает
указатель
на
выделенную
память.
Оператор
delete принимает
указатель
на
память,
которую
нужно
освободить.
39. Simple
Allocator [1/4]
Used_blocks: Память для стркутур Item
Free_blocks: Указатели на свободные блоки
Вначале
все
блоки
свободные.
Каждый
указатель
в
структуре
free_blocks указывает
на
некоторый
адрес
в
структуре
used_blocks.
40. Simple
Allocator
[2/4]
Used_blocks: Память для стркутур Item
Free_blocks: Указатели на свободные блоки
Когда
выделяется
память
– то
возвращается
значение
последнего
указателя
в
структуре
free_blocks на
адрес
В
used_blocks
41. Simple
Allocator
[3/4]
Used_blocks: Память для стркутур Item
Free_blocks: Указатели на свободные блоки
После
того
как
выделенно5
объектов
– мы
имеет
вот
такую
ситуацию
42. Simple
Allocator
[4/4]
Used_blocks: Память для стркутур Item
Free_blocks: Указатели на свободные блоки
Это
происходит
когда
мы
взывали
оператор
delete.
В
конец
массива
free_blocks добавляется
адрес
Освободившегося
блока