<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sergey.kazenyuk</id>
		<title>SEWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sergey.kazenyuk"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Sergey.kazenyuk"/>
		<updated>2026-04-08T14:52:53Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1951</id>
		<title>SE Wiki</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1951"/>
				<updated>2012-11-14T15:21:16Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Учебная информация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Учебная информация ==&lt;br /&gt;
[http://mit.spbau.ru/ru/scheduleSE Расписание]&lt;br /&gt;
&lt;br /&gt;
5 курс:&lt;br /&gt;
* [[Базы_данных_2012|Базы данных]]&lt;br /&gt;
* [[Алгебраические_структуры_2012|Алгебраические структуры]]&lt;br /&gt;
* [[Алгоритмы_и_структуры_данных_2012|Алгоритмы и структуры данных]]&lt;br /&gt;
* [[Операционные_системы_2012|Операционные системы]]&lt;br /&gt;
* [[Основы_программной_инженерии_2012|Основы программной инженерии]]&lt;br /&gt;
* [[Теория_графов_2012|Теория графов]]&lt;br /&gt;
* [[Комбинаторика_2012|Комбинаторика]]&lt;br /&gt;
* [[Мат_логика_2012|Мат. логика]]&lt;br /&gt;
* [[Unix_и_Скриптовые_языки_2012|Unix и скриптовые языки]]&lt;br /&gt;
* [[C___2012|С++]]&lt;br /&gt;
* [[Технологический_семинар_2012|Технологический семинар]]&lt;br /&gt;
* [[НИР_2012|НИР]]&lt;br /&gt;
&lt;br /&gt;
6 курс:&amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.google.com/calendar/embed?mode=WEEK&amp;amp;src=9f7hm9olebmkjnkglq6ussvd7s%40group.calendar.google.com&amp;amp;color=%23060D5E&amp;amp;src=e0hc0uakdjbknh05tcr5fomct8%40group.calendar.google.com&amp;amp;color=%232F6309&amp;amp;src=notnpt47cf0g3cufakpqpcecp5nt1505%40import.calendar.google.com&amp;amp;color=%235A6986&amp;amp;ctz=Europe%2FMoscow Расписание в гугл календаре (html)] [http://www.google.com/calendar/ical/9f7hm9olebmkjnkglq6ussvd7s%40group.calendar.google.com/public/basic.ics (ical)]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* [[Виртуальные_машины_2012|Виртуальные машины]]&lt;br /&gt;
* [[Машинное_обучение_2012|Машинное обучение]]&lt;br /&gt;
* &amp;lt;strike&amp;gt;[[UML_2012|UML]]&amp;lt;/strike&amp;gt;&lt;br /&gt;
* [[Компьютерная_графика_2012|Компьютерная графика]]&lt;br /&gt;
* [[Параллельные_и_распределенные_вычисления_2012|Параллельные и распределенные вычисления]]&lt;br /&gt;
* [[Программирование_в_ядре_Windows_2012|Программирование в ядре Windows]]&lt;br /&gt;
* [[Тестирование_ПО_2012|Тестирование ПО]]&lt;br /&gt;
* [[Анализ_данных_2012| Анализ данных]]&lt;br /&gt;
* [[Формальные_языки_2012|Формальные языки]]&lt;br /&gt;
* [[Методы_формальной_верификации_программ_2012|Методы формальной верификации программ]]&lt;br /&gt;
* [[Разработка_интерактивных_интерфейсов_2012|Разработка интерактивных интерфейсов]]&lt;br /&gt;
* [[SCALA_2012|Scala]]&lt;br /&gt;
* [[Сетевые технологии]]&lt;br /&gt;
* [[Обобщенное и генеративное программирование]]&lt;br /&gt;
&lt;br /&gt;
== Dev Days ==&lt;br /&gt;
&lt;br /&gt;
* [[Devdays2h2012| Dev days Осень 2012]]&lt;br /&gt;
&lt;br /&gt;
== Архив за прошлые семестры ==&lt;br /&gt;
* [[Весна_2012|Весенний семестр 2012]]&lt;br /&gt;
* [[Осень_2011|Осенний семестр 2011]]&lt;br /&gt;
&lt;br /&gt;
== Практики ==&lt;br /&gt;
* [[НИР 5SE осень 2012|Темы практик, осень 2012-го года]]&lt;br /&gt;
* [https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG9CRFdGa2tLeV9ab1l1QWlkOFp3bFE&amp;amp;output=html Темы практик, лето 2012-го года]&lt;br /&gt;
* [[Темы практик, 5SE, осень 2011-го года | Темы практик, осень 2011-го года]]&lt;br /&gt;
* [[Темы практик |Темы практик, весна 2011-го года]]&lt;br /&gt;
&lt;br /&gt;
== Студенты ==&lt;br /&gt;
* [[2010|Набор 2010-го года]]&lt;br /&gt;
* [[2011|Набор 2011-го года]]&lt;br /&gt;
* [[2012|Набор 2012-го года]]&lt;br /&gt;
&lt;br /&gt;
== Важные ссылки ==&lt;br /&gt;
Для 5-го курса:&lt;br /&gt;
* [http://code.google.com/p/spbau-cpp-2011/ cpp] - репозиторий для лабораторных по С++.&lt;br /&gt;
* [http://code.google.com/p/aptu-os/source/checkout aptu-os] - репозиторий для лабораторных по операционным системам.&lt;br /&gt;
&lt;br /&gt;
Для 6-го курса:&lt;br /&gt;
* [http://code.google.com/p/hpcource/ hpcource] - репозиторий для лабораторных по параллельному программированию.&lt;br /&gt;
* [http://code.google.com/p/mathvm/ mathvm] - репозиторий для лабораторных по виртуальным машинам.&lt;br /&gt;
* [http://code.google.com/p/spbau-network-2011/source/checkout spbau-network-2011] -  репозиторий для лабораторных по сетевым технологиям.&lt;br /&gt;
&lt;br /&gt;
== Дополнительно == &lt;br /&gt;
* [[Q&amp;amp;A]]&lt;br /&gt;
* [[Мероприятия]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1756</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1756"/>
				<updated>2012-11-09T12:19:27Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: переименовал «Участник:Sergey.kazenyuk» в «Участник:Sergey.Kazenyuk»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Activities =&lt;br /&gt;
&lt;br /&gt;
* Fall 2011: Recommender System&lt;br /&gt;
* Spring 2012: [[НИР#Конфигуратор контейнеров AndroidVM|AndroidVM Configurator]], [[AVMConf_Kazenyuk|Weekly reports]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.kazenyuk&amp;diff=1757</id>
		<title>Участник:Sergey.kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.kazenyuk&amp;diff=1757"/>
				<updated>2012-11-09T12:19:27Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: переименовал «Участник:Sergey.kazenyuk» в «Участник:Sergey.Kazenyuk»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Участник:Sergey.Kazenyuk]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1508</id>
		<title>SE Wiki</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1508"/>
				<updated>2012-09-13T14:41:19Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Учебная информация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Учебная информация ==&lt;br /&gt;
&lt;br /&gt;
* [[Unix_и_Скриптовые_языки_2012|Unix и скриптовые языки]]&lt;br /&gt;
* [[Методы_формальной_верификации_программ_2012|Методы формальной верификации программ]]&lt;br /&gt;
&lt;br /&gt;
== Архив за прошлые семестры ==&lt;br /&gt;
* [[Весна_2012|Весенний семестр 2012]]&lt;br /&gt;
* [[Осень_2011|Осенний семестр 2011]]&lt;br /&gt;
&lt;br /&gt;
== Практики ==&lt;br /&gt;
* [https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG9CRFdGa2tLeV9ab1l1QWlkOFp3bFE&amp;amp;output=html Темы практик, лето 2012-го года]&lt;br /&gt;
* [[Темы практик, 5SE, осень 2011-го года | Темы практик, осень 2011-го года]]&lt;br /&gt;
* [[Темы практик |Темы практик, весна 2011-го года]]&lt;br /&gt;
&lt;br /&gt;
== Студенты ==&lt;br /&gt;
* [[2010|Набор 2010-го года]]&lt;br /&gt;
* [[2011|Набор 2011-го года]]&lt;br /&gt;
* [[2012|Набор 2012-го года]]&lt;br /&gt;
&lt;br /&gt;
== Важные ссылки ==&lt;br /&gt;
Для 5-го курса:&lt;br /&gt;
* [http://code.google.com/p/spbau-cpp-2011/ cpp] - репозиторий для лабораторных по С++.&lt;br /&gt;
* [http://code.google.com/p/aptu-os/source/checkout aptu-os] - репозиторий для лабораторных по операционным системам.&lt;br /&gt;
&lt;br /&gt;
Для 6-го курса:&lt;br /&gt;
* [http://code.google.com/p/hpcource/ hpcource] - репозиторий для лабораторных по параллельному программированию.&lt;br /&gt;
* [http://code.google.com/p/mathvm/ mathvm] - репозиторий для лабораторных по виртуальным машинам.&lt;br /&gt;
* [http://code.google.com/p/spbau-network-2011/source/checkout spbau-network-2011] -  репозиторий для лабораторных по сетевым технологиям.&lt;br /&gt;
&lt;br /&gt;
== Дополнительно == &lt;br /&gt;
* [[Q&amp;amp;A]]&lt;br /&gt;
* [[Мероприятия]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%B2%D0%B5%D1%80%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC_2012&amp;diff=1507</id>
		<title>Методы формальной верификации программ 2012</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%B2%D0%B5%D1%80%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC_2012&amp;diff=1507"/>
				<updated>2012-09-13T14:39:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Новая страница: «== Некоторые материалы ==  http://dcn.infos.ru/~karpov/Model%20Checking%20Verification/»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Некоторые материалы ==&lt;br /&gt;
&lt;br /&gt;
http://dcn.infos.ru/~karpov/Model%20Checking%20Verification/&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1506</id>
		<title>SE Wiki</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1506"/>
				<updated>2012-09-13T14:37:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Учебная информация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Учебная информация ==&lt;br /&gt;
&lt;br /&gt;
[[Unix_и_Скриптовые_языки_2012|Unix и скриптовые языки]]&lt;br /&gt;
&lt;br /&gt;
[[Методы_формальной_верификации_программ_2012|Методы формальной верификации программ]]&lt;br /&gt;
&lt;br /&gt;
== Архив за прошлые семестры ==&lt;br /&gt;
* [[Весна_2012|Весенний семестр 2012]]&lt;br /&gt;
* [[Осень_2011|Осенний семестр 2011]]&lt;br /&gt;
&lt;br /&gt;
== Практики ==&lt;br /&gt;
* [https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG9CRFdGa2tLeV9ab1l1QWlkOFp3bFE&amp;amp;output=html Темы практик, лето 2012-го года]&lt;br /&gt;
* [[Темы практик, 5SE, осень 2011-го года | Темы практик, осень 2011-го года]]&lt;br /&gt;
* [[Темы практик |Темы практик, весна 2011-го года]]&lt;br /&gt;
&lt;br /&gt;
== Студенты ==&lt;br /&gt;
* [[2010|Набор 2010-го года]]&lt;br /&gt;
* [[2011|Набор 2011-го года]]&lt;br /&gt;
* [[2012|Набор 2012-го года]]&lt;br /&gt;
&lt;br /&gt;
== Важные ссылки ==&lt;br /&gt;
Для 5-го курса:&lt;br /&gt;
* [http://code.google.com/p/spbau-cpp-2011/ cpp] - репозиторий для лабораторных по С++.&lt;br /&gt;
* [http://code.google.com/p/aptu-os/source/checkout aptu-os] - репозиторий для лабораторных по операционным системам.&lt;br /&gt;
&lt;br /&gt;
Для 6-го курса:&lt;br /&gt;
* [http://code.google.com/p/hpcource/ hpcource] - репозиторий для лабораторных по параллельному программированию.&lt;br /&gt;
* [http://code.google.com/p/mathvm/ mathvm] - репозиторий для лабораторных по виртуальным машинам.&lt;br /&gt;
* [http://code.google.com/p/spbau-network-2011/source/checkout spbau-network-2011] -  репозиторий для лабораторных по сетевым технологиям.&lt;br /&gt;
&lt;br /&gt;
== Дополнительно == &lt;br /&gt;
* [[Q&amp;amp;A]]&lt;br /&gt;
* [[Мероприятия]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1505</id>
		<title>SE Wiki</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=SE_Wiki&amp;diff=1505"/>
				<updated>2012-09-13T14:37:03Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Учебная информация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Учебная информация ==&lt;br /&gt;
&lt;br /&gt;
[[Unix_и_Скриптовые_языки_2012|Unix и скриптовые языки]]&lt;br /&gt;
[[Методы_формальной_верификации_программ_2012|Методы формальной верификации программ]]&lt;br /&gt;
&lt;br /&gt;
== Архив за прошлые семестры ==&lt;br /&gt;
* [[Весна_2012|Весенний семестр 2012]]&lt;br /&gt;
* [[Осень_2011|Осенний семестр 2011]]&lt;br /&gt;
&lt;br /&gt;
== Практики ==&lt;br /&gt;
* [https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG9CRFdGa2tLeV9ab1l1QWlkOFp3bFE&amp;amp;output=html Темы практик, лето 2012-го года]&lt;br /&gt;
* [[Темы практик, 5SE, осень 2011-го года | Темы практик, осень 2011-го года]]&lt;br /&gt;
* [[Темы практик |Темы практик, весна 2011-го года]]&lt;br /&gt;
&lt;br /&gt;
== Студенты ==&lt;br /&gt;
* [[2010|Набор 2010-го года]]&lt;br /&gt;
* [[2011|Набор 2011-го года]]&lt;br /&gt;
* [[2012|Набор 2012-го года]]&lt;br /&gt;
&lt;br /&gt;
== Важные ссылки ==&lt;br /&gt;
Для 5-го курса:&lt;br /&gt;
* [http://code.google.com/p/spbau-cpp-2011/ cpp] - репозиторий для лабораторных по С++.&lt;br /&gt;
* [http://code.google.com/p/aptu-os/source/checkout aptu-os] - репозиторий для лабораторных по операционным системам.&lt;br /&gt;
&lt;br /&gt;
Для 6-го курса:&lt;br /&gt;
* [http://code.google.com/p/hpcource/ hpcource] - репозиторий для лабораторных по параллельному программированию.&lt;br /&gt;
* [http://code.google.com/p/mathvm/ mathvm] - репозиторий для лабораторных по виртуальным машинам.&lt;br /&gt;
* [http://code.google.com/p/spbau-network-2011/source/checkout spbau-network-2011] -  репозиторий для лабораторных по сетевым технологиям.&lt;br /&gt;
&lt;br /&gt;
== Дополнительно == &lt;br /&gt;
* [[Q&amp;amp;A]]&lt;br /&gt;
* [[Мероприятия]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1476</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1476"/>
				<updated>2012-06-26T21:10:00Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Практические задания - группа Москвина */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]] 30.03.2012&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]] 06.04.2012&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]] 13.04.2012&lt;br /&gt;
* [[Медиа:Fpc10.pdf|Лекция №10]] 27.04.2012&lt;br /&gt;
* [[Медиа:Fpc12.pdf|Лекция №12]] 18.05.2012&lt;br /&gt;
* [[Медиа:Fpc11.pdf|Лекция №13(11)]] 25.05.2012&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]] ([[Медиа:Fp07.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]] ([[Медиа:Fp08.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc09pr.pdf|Задание №9]] ([[Медиа:Fp09.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc10pr.pdf|Задание №10]] ([[Медиа:Fp10.hs.bz2|Пример]])&lt;br /&gt;
* Задание №11 ([[Медиа:Fp11.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc11.pdf&amp;diff=1475</id>
		<title>Файл:Fpc11.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc11.pdf&amp;diff=1475"/>
				<updated>2012-06-26T21:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Lecture (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Lecture (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc12.pdf&amp;diff=1474</id>
		<title>Файл:Fpc12.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc12.pdf&amp;diff=1474"/>
				<updated>2012-06-26T21:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Lecture (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Lecture (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1473</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1473"/>
				<updated>2012-06-26T21:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Лекции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]] 30.03.2012&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]] 06.04.2012&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]] 13.04.2012&lt;br /&gt;
* [[Медиа:Fpc10.pdf|Лекция №10]] 27.04.2012&lt;br /&gt;
* [[Медиа:Fpc12.pdf|Лекция №12]] 18.05.2012&lt;br /&gt;
* [[Медиа:Fpc11.pdf|Лекция №13(11)]] 25.05.2012&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]] ([[Медиа:Fp07.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]] ([[Медиа:Fp08.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc09pr.pdf|Задание №9]] ([[Медиа:Fp09.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc10pr.pdf|Задание №10]] ([[Медиа:Fp10.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=1452</id>
		<title>Итераторы и алгоритмы</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B_%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B&amp;diff=1452"/>
				<updated>2012-06-11T02:43:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Общие алгоритмы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Итераторы ==&lt;br /&gt;
&lt;br /&gt;
''Итератор'' --- это объект, указывающий на некоторый элемент цепочки элементов, позволяющий перебирать элементы цепочки с помощью некоторого набора операций. Процесс перебора элементов цепочки называется ''итерированием''.&lt;br /&gt;
&lt;br /&gt;
Наиболее очевидный пример итератора --- это указатель: указывает на объект, позволяет итерировать массив через инкремент и декремент. В C++ синтаксис итераторов заимствован у указателей.&lt;br /&gt;
&lt;br /&gt;
=== Классификация ===&lt;br /&gt;
&lt;br /&gt;
Выделяют пять типов итераторов. Ниже представлены итераторы в порядке убывания их силы.&lt;br /&gt;
&lt;br /&gt;
# ''Random Access''. Это наиболее мощный тип итераторов. Random access поддерживает произвольный доступ к последовательности элементов. По сути равносилен указателем: поддерживает операции инкремента(&amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt;), декремента (&amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt;), прибавления целого числа (&amp;lt;tt&amp;gt;+ val&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;- val&amp;lt;/tt&amp;gt;), разыменования (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;), разыменования со сдвигом (&amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;), доступа к члену (&amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;). Как пример, итераторы такого типа предоставляет &amp;lt;tt&amp;gt;vector&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# ''Bidirectional''. Двунаправленный итератор является более слабым типом итераторов: позволяет двигаться только вперед и назад, проходя через каждый элемент. Операции: &amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;. Как пример, итераторы такого типа предоставляет &amp;lt;tt&amp;gt;list&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# ''Forward''. Однонаправленный итератор позволяет двигаться только в одном направлении. Операции: &amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# ''Input''. Однонаправленный итератор, позволяющий только считывать данные, но не записывать. &lt;br /&gt;
# ''Output''. Однонаправленный итератор, позволяющий только записывать данные, но не считывать.&lt;br /&gt;
&lt;br /&gt;
Вне данной классификации лежит ''Reverse iterator''. Reverse iterator обращает направление для bidirectional и random access итераторов. Для получения начала и конца итератора необходимо вызвать &amp;lt;tt&amp;gt;rbegin()&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;rend()&amp;lt;/tt&amp;gt; соответственно. &lt;br /&gt;
Reverse iterator реализует функцию &amp;lt;tt&amp;gt;base()&amp;lt;/tt&amp;gt;, возвращающую обычный итератор. Для того, чтобы получить из обычного (bidirectional и random access) итератора reverse, достаточно использовать оператор присваивания.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 set&amp;lt; int &amp;gt; s;&lt;br /&gt;
 set&amp;lt; int &amp;gt; :: reverse_iterator i = s.rbegin();&lt;br /&gt;
 set&amp;lt; int &amp;gt; :: iterator j = i.base();&lt;br /&gt;
 i = j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Внимание, вопрос.''' Почему в одну сторону можно написать &amp;lt;tt&amp;gt;i = j&amp;lt;/tt&amp;gt;, а в другую только &amp;lt;tt&amp;gt;j = i.base()&amp;lt;/tt&amp;gt;?&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Внимание, вопрос.''' Почему нельзя менять значения в set?&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Служебная информация ===&lt;br /&gt;
&lt;br /&gt;
Для описания итератора в С++ существует шаблон &amp;lt;tt&amp;gt;iterator_traits&amp;lt;/tt&amp;gt;. Стандартные алгоритмы получают необходимую информацию об итераторах из специализаций этого шаблона для конкретного итератора.&lt;br /&gt;
&lt;br /&gt;
Определение iterator_traits выглядит следующим образом.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 template &amp;lt;class Iterator&amp;gt; struct iterator_traits {&lt;br /&gt;
   typedef typename Iterator::difference_type difference_type;&lt;br /&gt;
   typedef typename Iterator::value_type value_type;&lt;br /&gt;
   typedef typename Iterator::pointer pointer;&lt;br /&gt;
   typedef typename Iterator::reference reference;&lt;br /&gt;
   typedef typename Iterator::iterator_category iterator_category;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;difference_type&amp;lt;/tt&amp;gt; описывает тип разности итераторов.&lt;br /&gt;
* &amp;lt;tt&amp;gt;value_type&amp;lt;/tt&amp;gt; --- тип объекта, на который указывает итератор.&lt;br /&gt;
* &amp;lt;tt&amp;gt;pointer&amp;lt;/tt&amp;gt; --- тип указателя на объект&lt;br /&gt;
* &amp;lt;tt&amp;gt;reference&amp;lt;/tt&amp;gt; --- тип ссылки&lt;br /&gt;
* &amp;lt;tt&amp;gt;iterator_category_tag&amp;lt;/tt&amp;gt; --- категория итератора. Может быть&lt;br /&gt;
** &amp;lt;tt&amp;gt;input_iterator_tag&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;output_iterator_tag&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;forward_iterator_tag&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;bidirectional_iterator_tag&amp;lt;/tt&amp;gt;&lt;br /&gt;
** &amp;lt;tt&amp;gt;random_access_iterator_tag&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Стандартные функции ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;advance(iterator, n)&amp;lt;/tt&amp;gt; --- сдвигает итератор на n элементов. Для random access и bidirectional значение n может быть отрицательным. Работает со всеми типами итераторов вплоть до input. Для random access сдвигается сразу на n элементов, для остальных --- использует инкремент (или декремент).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;distance(iterator first, iterator last)&amp;lt;/tt&amp;gt; находит число элементов между first и last. Для radnom access использует значение разности итераторов, для остальных --- использует линейный поиск.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
C++ поддерживает набор функций, позволяющий работать с последовательностями элементов (range of elements). Джентльменский набор таких функций объявлен в хедере &amp;amp;lt;algorithm&amp;amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Каждый алгоритм может работать только с определенными типами итераторов. Необходимый тип будет указываться в качестве типа аргумента.&lt;br /&gt;
Например, запись &amp;lt;tt&amp;gt;count(Input p, Input q, T value)&amp;lt;/tt&amp;gt; означает, что функция &amp;lt;tt&amp;gt;count&amp;lt;/tt&amp;gt; принимает на вход итератор типа &amp;lt;tt&amp;gt;Input&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Запись &amp;lt;tt&amp;gt;sort(RandomAccess p, RandomAccess q[, Comparator cmp])&amp;lt;/tt&amp;gt; означает, что у функции &amp;lt;tt&amp;gt;sort&amp;lt;/tt&amp;gt; есть дополнительный необязательный параметр &amp;lt;tt&amp;gt;cmp&amp;lt;/tt&amp;gt;. В данном случае --- это компаратор: сущность, которая сравнивает два элемента и возврашает меньше ли первый аргумент второго.&lt;br /&gt;
&lt;br /&gt;
Под записью &amp;quot;итератор на элемент&amp;quot; следует понимать &amp;quot;итератор, указывающий на элемент&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Общие алгоритмы ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;swap(T&amp;amp; a, T&amp;amp; b)&amp;lt;/tt&amp;gt; меняет местами значения объектов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iter_swap(Forward1 a, Forward2 b)&amp;lt;/tt&amp;gt; меняет местами значения, на которые указывают итераторы (равносилен &amp;lt;tt&amp;gt;swap(*a, *b)&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;swap_ranges(Forward p1, Forward q1, Forward p2)&amp;lt;/tt&amp;gt; меняет местами значение каждого элемента последовательности из &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; со значением соответствующего элемента из &amp;lt;tt&amp;gt;[p2, ...)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;min(const T&amp;amp; a, const T&amp;amp;b [, Compare cmp ])&amp;lt;/tt&amp;gt; находит минимум двух элементов и возвращает ссылку на минимальный. Может на вход принимать третий аргумент: компаратор, т.е. функций, которой надо сравнивать элементы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;max(const T&amp;amp; a, const T&amp;amp;b [, Compare cmp ])&amp;lt;/tt&amp;gt; аналогичен минимуму.&lt;br /&gt;
&lt;br /&gt;
''Замечание'' В хедере win.h есть дефайны min и max. Если нужны функции из STL-а, стоит отключить &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; через &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Немодифицирующие алгоритмы ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;count(Input p, Input q, T value)&amp;lt;/tt&amp;gt; находит число вхождений элемента &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; в коллекцию &amp;lt;tt&amp;gt;[p, q)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;count_if(Input p, Input q, UnaryPredicate pred)&amp;lt;/tt&amp;gt; находит число элементов коллекции &amp;lt;tt&amp;gt;[p, q)&amp;lt;/tt&amp;gt;, удовлетворяющий унарному предикату &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;for_each(Input p, Input q, Func f)&amp;lt;/tt&amp;gt; вызывает последовательно функцию &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; для каждого элемента коллекции &amp;lt;tt&amp;gt;[p, q)&amp;lt;/tt&amp;gt;. Возвращает &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;equal(Input p1, Input q1, Input p2 [, BinaryPredicate pr])&amp;lt;/tt&amp;gt; сравнивает две последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;[p2, ?)&amp;lt;/tt&amp;gt;. Возвращает &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;, если первая является префиксом второй, т.е. элементы из &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; совпадают с первыми &amp;lt;tt&amp;gt;q1 - p1&amp;lt;/tt&amp;gt; элементами &amp;lt;tt&amp;gt;[p2, ?)&amp;lt;/tt&amp;gt;. В качестве дополнительного аргумента можно передать бинарный предикат равенства. Если вторая последовательность оказывается короче первой, поведение функции не определено.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;mismatch(Input p1, Input q1, Input p2[, BPredicate pr])&amp;lt;/tt&amp;gt; сравнивает две последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;[p2, ?)&amp;lt;/tt&amp;gt;. Возвращает пару итераторов, указывающих на первое различие. Если &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; является префиксом &amp;lt;tt&amp;gt;[p2, ?)&amp;lt;/tt&amp;gt;, то &amp;lt;tt&amp;gt;mismatch&amp;lt;/tt&amp;gt; возвращает пару &amp;lt;tt&amp;gt;(q1, q2)&amp;lt;/tt&amp;gt;, где &amp;lt;tt&amp;gt;q2&amp;lt;/tt&amp;gt; является элементов соответствующим &amp;lt;tt&amp;gt;q1&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;[p2, ?)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;lexicographical_compare(Input p1, Input q1, Input p2, Input q2[, Compare cmp])&amp;lt;/tt&amp;gt; возвращает меньше ли лексикографически &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; чем &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt;. Имеет дополнительный аргумент: компаратор cmp, сравнивающий два элемента последовательностей. Возвращает &amp;lt;tt&amp;gt;bool&amp;lt;tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;min_element(Forward p1, Forward q1[, Compare cmp])&amp;lt;/tt&amp;gt; возвращает итератор, указывающий на минимальный элемент в последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Имеет дополнительный аргумент: компаратор &amp;lt;tt&amp;gt;cmp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;max_element(Forward p1, Forward q1[, Compare cmp])&amp;lt;/tt&amp;gt; аналогичен &amp;lt;tt&amp;gt;min_element&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;search(Forward1 p1, Forward q1, Forward p2, Forward q2[, BPredicate pred])&amp;lt;/tt&amp;gt; находит первое вхождение последовательности &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;search_n(Forward1 p1, Forward q1, Size size, T&amp;amp; val[, BPredicate pred])&amp;lt;/tt&amp;gt; находит первое вхождение последовательности size элементов равных &amp;lt;tt&amp;gt;val&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt;. Можно передать свой компаратор в качестве пятого параметра &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;adjacent_find(Forward1 p1, Forward q1, Size size, T&amp;amp; val[, BPredicate pred])&amp;lt;/tt&amp;gt; находит первое вхождение двух равных элементов в последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Можно передать свой компаратор в качестве пятого параметра &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;find(Forward1 p1, Forward q1, T&amp;amp; val), find_if(Forward1 p1, Forward q1, UPredicate pr)&amp;lt;/tt&amp;gt; находят первое вхождение равное &amp;lt;tt&amp;gt;val&amp;lt;/tt&amp;gt; или удовлетворяющее предикату &amp;lt;tt&amp;gt;pr&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;find_first_of( Forward p1, Forward q1, Forward p2, Forward q2[, BPredicate pr])&amp;lt;/tt&amp;gt; находит первое вхождение последовательности &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Можно передать свой компаратор в качестве пятого параметра &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;find_end( Forward p1, Forward q1, Forward p2, Forward q2[, BPredicate pr])&amp;lt;/tt&amp;gt; находит последнее вхождение последовательности &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Можно передать свой компаратор в качестве пятого параметра &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Алгоритмы для отсортированных последовательностей (бинарный поиск) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;lower_bound(Forward p1, Forward q1, const T&amp;amp; value), lower_bound(Forward p1, Forward q1, const T&amp;amp; value, Comparator cmp)&amp;lt;/tt&amp;gt; возвращает итератор, указывающий на первый элемент &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; не меньший &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; или не удовлетворяющий компаратору &amp;lt;tt&amp;gt;cmp(_, value)&amp;lt;/tt&amp;gt; (под &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; подставляются элементы последовательности).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;upper_bound(Forward p1, Forward q1, const T&amp;amp; value), upper_bound(Forward p1, Forward q1, const T&amp;amp; value, Comparator cmp)&amp;lt;/tt&amp;gt; возвращает итератор, указывающий на первый элемент &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; больший &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; или удовлетворяющий компаратору &amp;lt;tt&amp;gt;cmp(value, _)&amp;lt;/tt&amp;gt; (под &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; подставляются элементы последовательности).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;equal_range(Forward p1, Forward q1, const T&amp;amp; value), equal_range(Forward p1, Forward q1, const T&amp;amp; value, Comparator cmp)&amp;lt;/tt&amp;gt; возвращает пару итераторов, указывающих на начало и конец подпоследовательности элементов, равных &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt;. Можно передать собственный компаратор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;binary_search(Forward p1, Forward q1, const T&amp;amp; value), binary_search(Forward p1, Forward q1, const T&amp;amp; value, Comparator cmp)&amp;lt;/tt&amp;gt; возвращает, есть ли элемент, равный &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; в последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;tt&amp;gt;. Можно передать собственный компаратор.&lt;br /&gt;
&lt;br /&gt;
=== Модифицирующие алгоритмы ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;copy(Input p1, Input q1, Output res)&amp;lt;/tt&amp;gt; копирует последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;copy_backward(Bidirectional p1, Bidirectional q1, Bidirectional res)&amp;lt;/tt&amp;gt; копирует последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt; с конца. При этом &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt; указывает на последний элемент контейнера, и копирование элементы копируются от &amp;lt;tt&amp;gt;q1 - 1&amp;lt;/tt&amp;gt; элемента к &amp;lt;tt&amp;gt;p1&amp;lt;/tt&amp;gt; элементу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;transform(Input p1, Input q1, Output res, UnaryFunctor f), transform(Input p1, Input q1, Input p2, Output res, BinaryFunctor f)&amp;lt;/tt&amp;gt; записывает в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt; последовательное применение функции &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; к каждому элементу последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Есть перегрузка функции для бинарной функции. В этом случае передается дополнительный параметр, указывающий на первый элемент последовательности вторых аргументов &amp;lt;tt&amp;gt;[p2, ...)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;replace(Forward p1, Forward q1, const T&amp;amp; oldValue, const T&amp;amp; newValue), replace_if(Forward p1, Forward q1, UnaryPredicate pred, const T&amp;amp; newValue)&amp;lt;/tt&amp;gt; заменяет элементы последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;, равные &amp;lt;tt&amp;gt;oldValue&amp;lt;/tt&amp;gt; или удовлетворяющие предикату &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;, на &amp;lt;tt&amp;gt;newValue&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;replace_copy(Input p1, Input q1, Output res, const T&amp;amp; oldValue, const T&amp;amp; newValue), replace_copy_if(Input p1, Input q1, Output res, UnaryPredicate pred, const T&amp;amp; newValue)&amp;lt;/tt&amp;gt; --- клоны &amp;lt;tt&amp;gt;replace&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;replace_if&amp;lt;/tt&amp;gt;. Записывают результат работы в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;fill(Forward p1, Forward q1, const T&amp;amp; value), fill_n(Output p1, Size n, const T&amp;amp; value)&amp;lt;/tt&amp;gt; заполняет последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;[p1, p1 + n)&amp;lt;/tt&amp;gt; значением &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;generate(Forward p1, Forward q1, Functor f), generate_n(Output p1, Size n, Functor f)&amp;lt;/tt&amp;gt; аналогичны &amp;lt;tt&amp;gt;fill&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;fill_n&amp;lt;/tt&amp;gt;. Только элементам последовательности присваивается результат работы функтора &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;remove(Forward p1, Forward q1, const T&amp;amp; value), remove_if(Forward p1, Forward q1, UnaryPredicate pred)&amp;lt;/tt&amp;gt; удаляют элементы последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;, равные &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; или удовлетворяющие предикату &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;remove(Forward p1, Forward q1, const T&amp;amp; value), remove_if(Forward p1, Forward q1, UnaryPredicate pred)&amp;lt;/tt&amp;gt; удаляют элементы последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;, равные &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; или удовлетворяющие предикату &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;remove_copy(Forward p1, Forward q1, Output res, const T&amp;amp; value), remove_copy_if(Forward p1, Forward q1, Output res, UnaryPredicate pred)&amp;lt;/tt&amp;gt; --- клоны &amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;remove_if&amp;lt;/tt&amp;gt;. Записывают результат работу в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;reverse(Bidirectional p1, Bidirectional q1), reverse_copy(Bidirectional p1, Bidirectional q1, Output res)&amp;lt;/tt&amp;gt; переворачивает последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;reverse_copy&amp;lt;/tt&amp;gt; записывает результат работы в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;random_shuffle(RandomAccess p1, RandomAccess q1), random_shuffle(RandomAccess p1, RandomAccess q1, RandomNumberGenerator&amp;amp; rnd)&amp;lt;/tt&amp;gt; перемешивают случайным образом последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Можно передать свой генертор случайных чисел в качестве дополнительного параметра. Генератор на вход принимает число &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; и генерирует случайные числа в диапазоне &amp;lt;tt&amp;gt;[0, n)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;unique(Input p1, Input q1), unique(Input p1, Input q1, BinaryPredicate pred)&amp;lt;/tt&amp;gt; удаляет из последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; цепочки равных элеметов, оставляя только один. Пример: &amp;lt;tt&amp;gt;(1,2,2,3,3,2,2) -&amp;gt; (1,2,3,2)&amp;lt;/tt&amp;gt;. Можно передать собственный предикат сравнения &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;. Возвращает итератор, указывающий на конец новой последовательности.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;unique_copy(Input p1, Input q1, Output res), unique_copy(Input p1, Input q1, Output res, BinaryPredicate pred)&amp;lt;/tt&amp;gt; --- клон &amp;lt;tt&amp;gt;unique&amp;lt;/tt&amp;gt;. Записывает результат своей работы в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;partition(Bidirectional p1, Bidirectional q1, Predicate pred)&amp;lt;/tt&amp;gt; упорядочивает элементы последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; так, что сначала идут элементы удовлетворяющие предикату &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;, а потом --- нет. Возвращает итератор на первый элемент, не удовлетворяющий &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;q1&amp;lt;/tt&amp;gt;, если таких не оказалось.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;stable_partition(Bidirectional p1, Bidirectional q1, Predicate pred)&amp;lt;/tt&amp;gt; аналог &amp;lt;tt&amp;gt;partition&amp;lt;/tt&amp;gt;. Сохраняет порядок следования элементов внутри удовлетворяющих и не удовлетворяющих &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt; подпоследовательностях. Возвращает также указатель на первый элемент, не удовлетворяющий &amp;lt;tt&amp;gt;pred&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритмы для отсортированных последовательностей (операции над множествами) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;merge(Input p1, Input q1, Input p2, Input q2, Output res[, Comparator cmp])&amp;lt;/tt&amp;gt; записывает в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt; упорядоченную последовательность элементов в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;, померджив отсортированные последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt;. Можно передать собственный компаратор. Возвращает итератор, указывающий на конец последовательности &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;inplace_merge(Bidirectional p1, Bidirectional mid, Bidirectional q1[, Comparator cmp])&amp;lt;/tt&amp;gt; мерджит на месте отсортированные последовательности &amp;lt;tt&amp;gt;[p1, mid)&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;[mid, q1)&amp;lt;/tt&amp;gt;. Можно передать собственный компаратор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;includes(Input p1, Input q1, Input p2, Input q2[, Comparator cmp])&amp;lt;/tt&amp;gt; определяет, есть ли в последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; подпоследовательность, равная &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt;. Последовательности равны есть каждый элемент первой равен соответствующему элементу второй и их длины равны. Можно передать свой собственный компаратор. Возвращает &amp;lt;tt&amp;gt;bool&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;(set_union, set_intersection, set_difference, set_symmetric_difference)(Input p1, Input q1, Input p2, Input q2, Output res[, Comparator cmp])&amp;lt;/tt&amp;gt; семейство функций, позволяющих производить стандартные операции над множествами. Множества представлены в отсортированных последовательностях &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt;. Результат записывается в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;. Результат --- множество, представленное в виде отсортированной последовательности. Чтобы результат совпадал с ожидаемым, в последовательностях не должно быть равных элементов. Можно передать свой компаратор. Функция возвращает итератор, указывающий на конец последовательности &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Сортировки, кучи и перестановки ====&lt;br /&gt;
&lt;br /&gt;
===== Сортировка =====&lt;br /&gt;
&amp;lt;tt&amp;gt;sort(RandomAccess p1, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; сортирует элементы последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Можно передать свой компаратор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;stable_sort(RandomAccess p1, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; --- версия стабильной сортировки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;partition_sort(RandomAccess p1, RandomAccess mid, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; переставляет последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; так, что первые &amp;lt;tt&amp;gt; mid - p1&amp;lt;/tt&amp;gt; идут в начале в возрастающем порядке, тогда как остальные идут в произвольном. Можно передать собственный компаратор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;partition_sort(Input p1, Input q1, RandomAccess p2, RandomAccess q2[, Comparator cmp])&amp;lt;/tt&amp;gt; копирует первые &amp;lt;tt&amp;gt;q2 - p2&amp;lt;/tt&amp;gt; минимальных элементов из &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; в &amp;lt;tt&amp;gt;[p2, q2)&amp;lt;/tt&amp;gt; в отсортированном порядке. &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; остается неизмененной.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;nth_element(RandomAccess p1, RandomAccess nth, RandomAccess q1[, Comaparator cmp])&amp;lt;/tt&amp;gt; переставляет последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; так, что на позиции &amp;lt;tt&amp;gt;nth&amp;lt;/tt&amp;gt; находится элемент, который находился бы там в случае сортировки всей последовательности. При этом все элементы до и после &amp;lt;tt&amp;gt;nth&amp;lt;/tt&amp;gt; могут идти в произвольном порядке. Можно передать свой собственный компаратор.&lt;br /&gt;
&lt;br /&gt;
===== Перестановки =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;next_permutation, prev_permutation(Bidirectional p1, Bidirectional q1[, Comparator cmp])&amp;lt;/tt&amp;gt; переставляет элементы последовательности получая следующую и предыдущую перестановку в лексикографическом порядке. Можно передать свой компаратор. Порядок зациклен, то есть после последней перестановки идет первая.&lt;br /&gt;
&lt;br /&gt;
===== Кучи =====&lt;br /&gt;
&lt;br /&gt;
Куча здесь используется в смысле структуры данных. Последовательность &amp;lt;tt&amp;gt;[0, n)&amp;lt;/tt&amp;gt; --- куча, если для любого &amp;lt;tt&amp;gt;0 &amp;amp;lt;= i &amp;amp;lt; n&amp;lt;/tt&amp;gt; верно &amp;lt;tt&amp;gt;a[i] &amp;amp;lt;= a[2 * i + 1]&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;a[i] &amp;amp;lt;= a[2 * i + 2]&amp;lt;/tt&amp;gt;. Более подробно можно посмотреть в Кормене.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;push_heap(RandomAccess p1, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; расширяет кучу &amp;lt;tt&amp;gt;[p1, q1 - 1)&amp;lt;/tt&amp;gt; до &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;, добавляя элемент &amp;lt;tt&amp;gt;q1 - 1&amp;lt;/tt&amp;gt;. Можно передать свой компаратор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;pop_heap(RandomAccess p1, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; переставляет кучу &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; так, что первый элемент оказывается на &amp;lt;tt&amp;gt;q1 - 1&amp;lt;/tt&amp;gt; позиции, а &amp;lt;tt&amp;gt;[p1, q1 - 1)&amp;lt;/tt&amp;gt; снова образует кучу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;make_heap(RanddomAccess p1, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; переставляет последовательность &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; так, чтобы она представляла кучу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sort_heap(RanddomAccess p1, RandomAccess q1[, Comparator cmp])&amp;lt;/tt&amp;gt; сортирует кучу.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритмы для работы с численными последовательностями ===&lt;br /&gt;
&lt;br /&gt;
Функции, описанные ниже, находятся в хедере &amp;lt;tt&amp;gt;numeric&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;accumulate(Input p1, Input q1, T init[, BinaryOperation op])&amp;lt;/tt&amp;gt; суммирует последовательно от &amp;lt;tt&amp;gt;p1&amp;lt;/tt&amp;gt; к &amp;lt;tt&amp;gt;q1&amp;lt;/tt&amp;gt; все элементы последовательности начиная со значения T. Пример: &amp;lt;tt&amp;gt;((1,2,3), 10) -&amp;amp;gt; 16&amp;lt;/tt&amp;gt;. Вместо суммы можно передать собственную операцию &amp;lt;tt&amp;gt;op&amp;lt;/tt&amp;gt;. Элементы последовательности будут передаваться &amp;lt;tt&amp;gt;op&amp;lt;/tt&amp;gt; в качестве второго аргумента. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;adjacent_difference(Input p1, Input q1, Output res[, BinaryOperation op])&amp;lt;/tt&amp;gt; записывает в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt; частичные разности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt;. Так если &amp;lt;tt&amp;gt;[p1, q1) = (x0, x1, x2)&amp;lt;/tt&amp;gt;, то в &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt; будет записано &amp;lt;tt&amp;gt;(x0, x1 - x0, x2 - x1)&amp;lt;/tt&amp;gt;. Вместо разности можно передать собственную операцию &amp;lt;tt&amp;gt;op&amp;lt;/tt&amp;gt;. Возвращает итератор, указывающий на конец &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;inner_product(Input p1, Input q1, Input p2, T init[, BinaryOperation1 add, BinaryOperation2 mult])&amp;lt;/tt&amp;gt; находит сумму попарных произведений элементов последовательностей &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;[p2, ...)&amp;lt;/tt&amp;gt; плюс начальное значение &amp;lt;tt&amp;gt;init&amp;lt;/tt&amp;gt;. Можно задать свои операции сложения и умножения &amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;mult&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;partial_sum(Input p1, Input q1, Output res[, BinaryOperation op])&amp;lt;/tt&amp;gt; находит частичные суммы последовательности &amp;lt;tt&amp;gt;[p1, q1)&amp;lt;/tt&amp;gt; и записывает их в res. Можно задать свою операцию сложения &amp;lt;tt&amp;gt;op&amp;lt;/tt&amp;gt;. Возвращает итератор, указывающий на конец &amp;lt;tt&amp;gt;res&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Внешние источники ==&lt;br /&gt;
&lt;br /&gt;
[http://cplusplus.com/reference/algorithm/ Референс по алгоритмам]&lt;br /&gt;
&lt;br /&gt;
[http://cplusplus.com/reference/std/iterator/ Об итераторах на английском]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8_Boost&amp;diff=1451</id>
		<title>Обзор библиотеки Boost</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8_Boost&amp;diff=1451"/>
				<updated>2012-06-11T01:17:49Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Итераторы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Мы рассмотрим несколько полезных модулей библиотеки Boost,&lt;br /&gt;
&lt;br /&gt;
== Умные указатели ==&lt;br /&gt;
&lt;br /&gt;
Все рассмотренные в прошлом семестре &amp;lt;&amp;lt;умные&amp;gt; указатели [http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/smart_ptr.htm представлены]&lt;br /&gt;
в библиотеке Boost.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;scoped_ptr&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;scoped_array&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;shared_ptr&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;shared_array&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;weak_ptr&amp;lt;/code&amp;gt; --- ссылка на объект, который находится под управлением &amp;lt;code&amp;gt;shared_ptr&amp;lt;/code&amp;gt;. Следует отметить, что через этот указатель нельзя обратиться к объекту напрямую --- можно только создать &amp;lt;code&amp;gt;shared_ptr&amp;lt;/code&amp;gt;, указывающий на этот объект, с помощью метода &amp;lt;code&amp;gt;lock()&amp;lt;/code&amp;gt; --- если объект уже уничтожен, то возвращается пустой &amp;lt;code&amp;gt;shared_ptr&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;intrusive_ptr&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; --- аналог &amp;lt;code&amp;gt;shared_ptr&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt;; требует, чтобы у типа &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; были определены методы intrusive_ptr_add_ref() и intrusive_ptr_release(). У &amp;lt;code&amp;gt;intrusive_ptr&amp;lt;/code&amp;gt;, по крайней мере, два преимущества перед &amp;lt;code&amp;gt;shared_ptr&amp;lt;/code&amp;gt;:&lt;br /&gt;
** размер объекта &amp;lt;code&amp;gt;intrusive_ptr&amp;lt;/code&amp;gt; совпадает с размером указателя,&lt;br /&gt;
** объекта &amp;lt;code&amp;gt;intrusive_ptr&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; можно проинициализировать от произвольного &amp;lt;code&amp;gt;T*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Версия &amp;lt;&amp;lt;умного&amp;gt;&amp;gt; указателя с суффиксом &amp;lt;code&amp;gt;_array&amp;lt;/code&amp;gt; управляет временем жизни массива, а не&lt;br /&gt;
отдельного объекта&lt;br /&gt;
&lt;br /&gt;
== Строковые алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
[http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo/quickref.html Строковые алгоритмы] Boost являются&lt;br /&gt;
обобщением и расширением методов строковых классов STL и алгоритмов STL, предназначенных для работы с последовательностями.&lt;br /&gt;
&lt;br /&gt;
* Преобразование регистра: &amp;lt;code&amp;gt;to_upper(input)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;to_lower(iput)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Удаление пробельных символов в начале и в конце строки &amp;lt;code&amp;gt;trim_left[_if](input [, predicate])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;trim_right[_if](input[, predicate]&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;trim[_if](input[, predicate])&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Предикаты: &amp;lt;code&amp;gt;[i]strarts_with(range1, range2 [, comp])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]ends_with(range1, range2 [, comp])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]contains(range1, range2 [, comp])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]equals(range1, range2 [, comp])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]lexicographical_compare(range1, range2 [, comp])&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Алгоритмы поиска: &amp;lt;code&amp;gt;[i]find_first(input, search)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]find_last(input, search)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]find_nth(input, search)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i]find_regex(input, regex)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Алгоритмы замены: &amp;lt;code&amp;gt;[i][replace|erase]_first(input, search [, format])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i][replace|erase]_last(input, search [, format])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i][replace|erase]_nth(input, search [, format])&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[i][replace|erase]_regex(input, regex [,format])&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;split[_regex](result, input [, predicate | regex])&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;join(input, separator)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Функторы-классификаторы символов&lt;br /&gt;
&lt;br /&gt;
Существуют версии этих алгоритмов с суффиксом &amp;lt;code&amp;gt;_copy&amp;lt;/code&amp;gt;, которые выполняют те же действия над копией входной строки и возвращают ее.&lt;br /&gt;
&lt;br /&gt;
== Итераторы ==&lt;br /&gt;
&lt;br /&gt;
Библиотека [http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/index.html итераторов] Boost расширяет концепцию итераторов STL.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;counting_iterator&amp;lt;Incrementable&amp;gt;&amp;lt;/code&amp;gt; --- реализует концепцию &amp;lt;&amp;lt;ленивой&amp;gt;&amp;gt; последовательности --- итератор получает новое значение, выполняя операцию &amp;lt;code&amp;gt;Incrementable::operator++&amp;lt;/code&amp;gt; над обернутым объектом.&lt;br /&gt;
* &amp;lt;code&amp;gt;filter_iterator&amp;lt;Predicate, Iterator&amp;gt;&amp;lt;/code&amp;gt; --- итерирует подмножество значений обернутого итератора.&lt;br /&gt;
* &amp;lt;code&amp;gt;function_output_iterator&amp;lt;UnaryFunction&amp;gt;&amp;lt;/code&amp;gt; --- преобразует записываемое в итератор значение с помощью указанной функции.&lt;br /&gt;
* &amp;lt;code&amp;gt;indirect_iterator&amp;lt;Iterator&amp;gt;&amp;lt;/code&amp;gt; --- итерирует объекты, на которые указывают значения другого итератора.&lt;br /&gt;
* &amp;lt;code&amp;gt;permutation_iterator&amp;lt;ElementIterator, IndexIterator&amp;gt;&amp;lt;/code&amp;gt; --- итерирует по перестановкам значений итераторя ElementIterator, задаваемым итератором IndexIterator.&lt;br /&gt;
* &amp;lt;code&amp;gt;reverse_iterator&amp;lt;Iterator&amp;gt;&amp;lt;/code&amp;gt; --- расширение стандартного обратного итератора.&lt;br /&gt;
* &amp;lt;code&amp;gt;shared_container_iterator&amp;lt;Container&amp;gt;&amp;lt;/code&amp;gt; --- продлевает жизнь захваченному контейнеру: пока существует итератор контейнер не будет уничтожен.&lt;br /&gt;
* &amp;lt;code&amp;gt;transform_iterator&amp;lt;UnaryFunction, Iterator&amp;gt;&amp;lt;/code&amp;gt; --- вызывает UnaryFunction над значением обернутого итератора при каждом разыменовании м возвращает результат.&lt;br /&gt;
* &amp;lt;code&amp;gt;zip_iterator&amp;lt;IteratorTuple&amp;gt;&amp;lt;/code&amp;gt; --- итерирует множество итераторов.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;lambda&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Модуль [http://www.boost.org/doc/libs/1_46_1/libs/bind/bind.html &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt;] библиотеки Boost является обобщением функций &amp;lt;code&amp;gt;std::bind1st&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;std::bind2nd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bind(g, _1, _1, _1)(x, y, z);     // g(x, x, x)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модуль [http://www.boost.org/doc/libs/1_46_1/doc/html/lambda/using_library.html &amp;lt;code&amp;gt;lambda&amp;lt;/code&amp;gt;] библиотеки Boost вводит концепцию безымянных функций.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_new_%D0%B8_delete._%D0%9F%D0%B0%D0%B2%D0%B5%D0%BB_%D0%A1%D0%B8%D0%BD%D0%B0%D0%B9&amp;diff=1450</id>
		<title>Перегрузка операторов new и delete. Павел Синай</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_new_%D0%B8_delete._%D0%9F%D0%B0%D0%B2%D0%B5%D0%BB_%D0%A1%D0%B8%D0%BD%D0%B0%D0%B9&amp;diff=1450"/>
				<updated>2012-06-11T00:51:18Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Возможные проблемы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Для чего это нужно ==&lt;br /&gt;
* Организация кэширования памяти.&lt;br /&gt;
* Организация сборщика мусора.&lt;br /&gt;
* Поиск утечек памяти.&lt;br /&gt;
&lt;br /&gt;
== Перегрузка операторов new и delete в классах ==&lt;br /&gt;
Как это делается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A&lt;br /&gt;
{&lt;br /&gt;
   int a;&lt;br /&gt;
&lt;br /&gt;
   void * operator new(size_t size)&lt;br /&gt;
   {&lt;br /&gt;
      return malloc(size);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void operator delete(void *p)&lt;br /&gt;
   {&lt;br /&gt;
      free(p);&lt;br /&gt;
   }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эти операторы являются '''static'''.&lt;br /&gt;
&lt;br /&gt;
В оператор new передается параметр size, указывающий сколько памяти нужно выделить. Это сделано для возможности наследования от нашего класса - наследникам скорее всего понадобится больше памяти, и мы должны ее выделить.&lt;br /&gt;
Возвращаемое значение оператора new '''void*''', а не '''A*''', так как на момент его работы объект еще не существует. Конструктор будет вызван только после успешной отработки оператора new.&lt;br /&gt;
&lt;br /&gt;
Перегрузка операторов для создания и удаления массива объектов производится отдельно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void * operator new[](size_t size)&lt;br /&gt;
{&lt;br /&gt;
   return malloc(size);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void operator delete[](void *p)&lt;br /&gt;
{&lt;br /&gt;
   free(p);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В оператор new передается размер блока памяти, предназначенного для хранения '''всех''' объектов в массиве. После выполнения оператора new[] производится последовательный вызов конструкторов для объектов из массива.&lt;br /&gt;
Перед выполнением оператора delete[] производится последовательный вызов деструкторов для всех объектов.&lt;br /&gt;
&lt;br /&gt;
== Возможные проблемы ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct B : A&lt;br /&gt;
{&lt;br /&gt;
   int b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
B *pb = new B[10];&lt;br /&gt;
A *pa = pb;         //Ошибки не будет&lt;br /&gt;
&lt;br /&gt;
delete [] pa;      //Ошибка - пытаемся вызвать 10 раз деструктор &lt;br /&gt;
                   // для объекта класса A, но там объект класса B.&lt;br /&gt;
pa++;              //Ошибка - указатель сдвинется на размер класса A, &lt;br /&gt;
                   // но поскольку в массиве лежат объекты класса B &lt;br /&gt;
                   // другого размера pa будет указывать не на &lt;br /&gt;
                   // следующий объект, а непонятно куда.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Перегрузка глобальных операторов new и delete ==&lt;br /&gt;
Если перегрузить операторы вне класса, то будет произведена перегрузка всех соответствующих операторов, находящихся как внутри классов так и глобальных.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void * operator new(size_t size)&lt;br /&gt;
{&lt;br /&gt;
   return malloc(size);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void operator delete(void *p)&lt;br /&gt;
{&lt;br /&gt;
   free(p);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для перегрузки глобальных операторов также нужно перегружать отдельно операторы new и new[], delete и delete[].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные параметры оператора new ==&lt;br /&gt;
Обычно, при ошибке во время выполнения оператора new кидается исключение. Можно сделать так, чтобы исключение не кидалось, а вместо этого оператор возвращал NULL:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int *pi = new(std::no_throw) int;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для оператора delete такой возможности не предусмотрено, так как он в любом случае не кидает исключений.&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создавать объект на уже выделенной памяти:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int *A = new(pi)A();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эту операцию нужно производить осторожно - размера выделенной заранее памяти должно хватить для размещения объекта A.&lt;br /&gt;
В данном примере класс A содержит единственное поле int a, так что места для него будет достаточно.&lt;br /&gt;
&lt;br /&gt;
Возможные применения:&lt;br /&gt;
* Работа при сильно ограниченной памяти.&lt;br /&gt;
* Необходимость создать объект по строго определенному адресу в памяти (например при работе со встраиваемой системой, если нужно создать объект для управления неким аппаратным ресурсом, расположенном по известному адресу).&lt;br /&gt;
* Реализация паттерна &amp;quot;Феникс&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_new_%D0%B8_delete._%D0%9F%D0%B0%D0%B2%D0%B5%D0%BB_%D0%A1%D0%B8%D0%BD%D0%B0%D0%B9&amp;diff=1449</id>
		<title>Перегрузка операторов new и delete. Павел Синай</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2_new_%D0%B8_delete._%D0%9F%D0%B0%D0%B2%D0%B5%D0%BB_%D0%A1%D0%B8%D0%BD%D0%B0%D0%B9&amp;diff=1449"/>
				<updated>2012-06-11T00:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Возможные проблемы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Для чего это нужно ==&lt;br /&gt;
* Организация кэширования памяти.&lt;br /&gt;
* Организация сборщика мусора.&lt;br /&gt;
* Поиск утечек памяти.&lt;br /&gt;
&lt;br /&gt;
== Перегрузка операторов new и delete в классах ==&lt;br /&gt;
Как это делается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A&lt;br /&gt;
{&lt;br /&gt;
   int a;&lt;br /&gt;
&lt;br /&gt;
   void * operator new(size_t size)&lt;br /&gt;
   {&lt;br /&gt;
      return malloc(size);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   void operator delete(void *p)&lt;br /&gt;
   {&lt;br /&gt;
      free(p);&lt;br /&gt;
   }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эти операторы являются '''static'''.&lt;br /&gt;
&lt;br /&gt;
В оператор new передается параметр size, указывающий сколько памяти нужно выделить. Это сделано для возможности наследования от нашего класса - наследникам скорее всего понадобится больше памяти, и мы должны ее выделить.&lt;br /&gt;
Возвращаемое значение оператора new '''void*''', а не '''A*''', так как на момент его работы объект еще не существует. Конструктор будет вызван только после успешной отработки оператора new.&lt;br /&gt;
&lt;br /&gt;
Перегрузка операторов для создания и удаления массива объектов производится отдельно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void * operator new[](size_t size)&lt;br /&gt;
{&lt;br /&gt;
   return malloc(size);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void operator delete[](void *p)&lt;br /&gt;
{&lt;br /&gt;
   free(p);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В оператор new передается размер блока памяти, предназначенного для хранения '''всех''' объектов в массиве. После выполнения оператора new[] производится последовательный вызов конструкторов для объектов из массива.&lt;br /&gt;
Перед выполнением оператора delete[] производится последовательный вызов деструкторов для всех объектов.&lt;br /&gt;
&lt;br /&gt;
== Возможные проблемы ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct B : A&lt;br /&gt;
{&lt;br /&gt;
   int b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
B *pb = new B[10];&lt;br /&gt;
A *pa = pb;         //ошибки не будет&lt;br /&gt;
&lt;br /&gt;
delete [] pa;      //ошибка - пытаемся вызвать 10 раз деструктор &lt;br /&gt;
                   // для объекта класса A, но там объект класса B.&lt;br /&gt;
pa++;              //ошибка - указатель сдвинется на размер класса A, &lt;br /&gt;
                   // но поскольку в массиве лежат объекты класса B &lt;br /&gt;
                   // другого размера pa будет указывать не на &lt;br /&gt;
                   // следующий объект, а непонятно куда.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Перегрузка глобальных операторов new и delete ==&lt;br /&gt;
Если перегрузить операторы вне класса, то будет произведена перегрузка всех соответствующих операторов, находящихся как внутри классов так и глобальных.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void * operator new(size_t size)&lt;br /&gt;
{&lt;br /&gt;
   return malloc(size);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void operator delete(void *p)&lt;br /&gt;
{&lt;br /&gt;
   free(p);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для перегрузки глобальных операторов также нужно перегружать отдельно операторы new и new[], delete и delete[].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные параметры оператора new ==&lt;br /&gt;
Обычно, при ошибке во время выполнения оператора new кидается исключение. Можно сделать так, чтобы исключение не кидалось, а вместо этого оператор возвращал NULL:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int *pi = new(std::no_throw) int;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для оператора delete такой возможности не предусмотрено, так как он в любом случае не кидает исключений.&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создавать объект на уже выделенной памяти:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int *A = new(pi)A();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эту операцию нужно производить осторожно - размера выделенной заранее памяти должно хватить для размещения объекта A.&lt;br /&gt;
В данном примере класс A содержит единственное поле int a, так что места для него будет достаточно.&lt;br /&gt;
&lt;br /&gt;
Возможные применения:&lt;br /&gt;
* Работа при сильно ограниченной памяти.&lt;br /&gt;
* Необходимость создать объект по строго определенному адресу в памяти (например при работе со встраиваемой системой, если нужно создать объект для управления неким аппаратным ресурсом, расположенном по известному адресу).&lt;br /&gt;
* Реализация паттерна &amp;quot;Феникс&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2._RTTI&amp;diff=1448</id>
		<title>Приведение типов. RTTI</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2._RTTI&amp;diff=1448"/>
				<updated>2012-06-11T00:40:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* dynamic_cast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Приведение типов==&lt;br /&gt;
Приведение типов делится на C style cast и C++ style cast&lt;br /&gt;
===Приведение в стиле C===&lt;br /&gt;
Синтаксис приведения:&lt;br /&gt;
* (тип_к_которому_приводим) переменная&lt;br /&gt;
* тип_к_которому_приводим (переменная)&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int i = 10;&lt;br /&gt;
double d = (double) i;&lt;br /&gt;
float f = float(i);&lt;br /&gt;
char const* ch = &amp;quot;hello&amp;quot;;&lt;br /&gt;
string str = (string) ch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Приведение в стиле С++===&lt;br /&gt;
В С++ для приведения типов используются следующие функции:&lt;br /&gt;
* const_cast&lt;br /&gt;
* reinterpret_cast&lt;br /&gt;
* static_cast&lt;br /&gt;
* dynamic_cast&lt;br /&gt;
Во всех случаях синтаксис приведения будет выглядеть следующим образом:&lt;br /&gt;
..._cast &amp;lt;тип_к_которому_приводим&amp;gt; (переменная)&lt;br /&gt;
&lt;br /&gt;
Рассмотрим первые три более подробно (dynamic_cast рассматривается в разделе RTTI).&lt;br /&gt;
====const_cast====&lt;br /&gt;
Добавляет/убирает у объекта константность. Если убрать константность у объекта, который был объявлен как константный, то при записи может возникнуть undefined behavior (в зависимости от типа объекта).&lt;br /&gt;
&lt;br /&gt;
Рассмотрим ситуацию, когда нам может пригодиться const_cast.&lt;br /&gt;
Предположим у нас класс A, в котором хранятся элементы типа Т. Пусть требуется реализовать метод get (константный и не константный), который по индексу i будет возвращать i-ый элемент. Можно описать реализацию только одного метода (константного), а второй реализовать через вызов первого при помощи const_cast:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
T const&amp;amp; get (int i) const;&lt;br /&gt;
T&amp;amp;       get (int i) {&lt;br /&gt;
    return const_cast&amp;lt;T&amp;amp;&amp;gt; (const_cast&amp;lt;A const*&amp;gt; (this).get(i) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
====reinterpret_cast====&lt;br /&gt;
Приводит любой указатель к любому указателю.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Point3 {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    double z;&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
Point3* p = ...;&lt;br /&gt;
double* p_x = reinterpret_cast&amp;lt;double*&amp;gt; (p);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Замечание: приведенный пример отработает корректно в случае если структура Point3 плотно упакована в памяти (см. опции компилятора).&lt;br /&gt;
====static_cast====&lt;br /&gt;
Используется для приведения&lt;br /&gt;
* числовых типов (аналогично C-style cast)&lt;br /&gt;
* указателей и ссылок для классов связанных наследованием&lt;br /&gt;
* пользовательских преобразований&lt;br /&gt;
Преобразование выполняется в момент компиляции и run-time проверки (как это есть в dynamic_cast) приведения типов нет, поэтому сложные приведения типов следует делать очень аккуратно. &lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {};&lt;br /&gt;
struct B : A {};&lt;br /&gt;
...&lt;br /&gt;
B* b;&lt;br /&gt;
A* a = static_cast&amp;lt;A*&amp;gt; (b);&lt;br /&gt;
b = static_cast&amp;lt;B*&amp;gt; (a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание: static_cast меняет указатель в зависимости от того какое у классов наследование (в отличии от reinterpret_cast), поэтому если будет forward declaration, то static_cast выдаст ошибку (на этапе компиляции):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A;&lt;br /&gt;
struct B;&lt;br /&gt;
B* b;&lt;br /&gt;
A* a = static_cast&amp;lt;A*&amp;gt;(b); // ошибка!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Общее замечание по разделу Приведение типов===&lt;br /&gt;
При программировании на С++ рекомендуется использовать C-style cast только в случаях приведения элементарных типов друг к другу.&lt;br /&gt;
&lt;br /&gt;
==RTTI==&lt;br /&gt;
RTTI расшифровывается как Run-time type information. Это механизм, позволяющий определять тип объекта в момент выполнения программы. В С++ данный механизм реализуется при помощи следующих элементов:&lt;br /&gt;
* оператор dynamic_cast (используется для преобразования полиморфных типов)&lt;br /&gt;
* оператор typeid (для точного определения типа объекта)&lt;br /&gt;
* класс type_info (для хранения информации, возвращаемой оператором typeid)&lt;br /&gt;
&lt;br /&gt;
Рассмотрим применение и синтаксис typeid и type_info на примере:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
A* a;&lt;br /&gt;
type_info&amp;amp; ti = typeid(a);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; ti.name() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Более сложный пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
struct A {};&lt;br /&gt;
struct B : A {};&lt;br /&gt;
...&lt;br /&gt;
A* a = new B();&lt;br /&gt;
typeid(a);  // A*&lt;br /&gt;
typeid(*a); // B&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У класса type_info помимо метода name (возвращающего строку - char*, характеризующую тип объекта) и операторов равенства/неравенства есть еще метод before, который позволяет упорядочивать экземпляры type_info и хранить их, например, в map.&lt;br /&gt;
&lt;br /&gt;
===dynamic_cast===&lt;br /&gt;
Позволяет приводить указатель или объект одного типа к указателю или ссылке на другой класс (связанный с первым через наследование).&lt;br /&gt;
В отличии от static_cast выполняется в run-time.&lt;br /&gt;
При ошибке приведения к указателю на тип dynamic_cast возвращает нулевой указатель, при ошибке приведения к ссылке на тип выбрасывается исключение bad_cast.&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {&lt;br /&gt;
	virtual void f() {}&lt;br /&gt;
};&lt;br /&gt;
struct B : A {&lt;br /&gt;
	virtual void f() {}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
A* pa = new B;&lt;br /&gt;
A* pa2 = new A;&lt;br /&gt;
&lt;br /&gt;
B* pb = dynamic_cast&amp;lt;B*&amp;gt;(pa);   // pb указывает на B&lt;br /&gt;
B* pb2 = dynamic_cast&amp;lt;B*&amp;gt;(pa2); // pb2 указывает на А, а не на В!&lt;br /&gt;
&lt;br /&gt;
pb-&amp;gt;f();&lt;br /&gt;
pb2-&amp;gt;f(); // ошибка на этапе исполнения!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание: При приведении к указателю на void возвращается указатель на начало блока.&lt;br /&gt;
&lt;br /&gt;
=== Общие замечания по разделу RTTI ===&lt;br /&gt;
* почти всегда можно обойтись без RTTI и чаще всего использование этого механизма говорит об ошибке проектирования&lt;br /&gt;
* на этапе отладки применение RTTI бывает полезно.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2._RTTI&amp;diff=1447</id>
		<title>Приведение типов. RTTI</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2._RTTI&amp;diff=1447"/>
				<updated>2012-06-11T00:34:31Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* =Общее замечание по разделу Приведение типов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Приведение типов==&lt;br /&gt;
Приведение типов делится на C style cast и C++ style cast&lt;br /&gt;
===Приведение в стиле C===&lt;br /&gt;
Синтаксис приведения:&lt;br /&gt;
* (тип_к_которому_приводим) переменная&lt;br /&gt;
* тип_к_которому_приводим (переменная)&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int i = 10;&lt;br /&gt;
double d = (double) i;&lt;br /&gt;
float f = float(i);&lt;br /&gt;
char const* ch = &amp;quot;hello&amp;quot;;&lt;br /&gt;
string str = (string) ch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Приведение в стиле С++===&lt;br /&gt;
В С++ для приведения типов используются следующие функции:&lt;br /&gt;
* const_cast&lt;br /&gt;
* reinterpret_cast&lt;br /&gt;
* static_cast&lt;br /&gt;
* dynamic_cast&lt;br /&gt;
Во всех случаях синтаксис приведения будет выглядеть следующим образом:&lt;br /&gt;
..._cast &amp;lt;тип_к_которому_приводим&amp;gt; (переменная)&lt;br /&gt;
&lt;br /&gt;
Рассмотрим первые три более подробно (dynamic_cast рассматривается в разделе RTTI).&lt;br /&gt;
====const_cast====&lt;br /&gt;
Добавляет/убирает у объекта константность. Если убрать константность у объекта, который был объявлен как константный, то при записи может возникнуть undefined behavior (в зависимости от типа объекта).&lt;br /&gt;
&lt;br /&gt;
Рассмотрим ситуацию, когда нам может пригодиться const_cast.&lt;br /&gt;
Предположим у нас класс A, в котором хранятся элементы типа Т. Пусть требуется реализовать метод get (константный и не константный), который по индексу i будет возвращать i-ый элемент. Можно описать реализацию только одного метода (константного), а второй реализовать через вызов первого при помощи const_cast:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
T const&amp;amp; get (int i) const;&lt;br /&gt;
T&amp;amp;       get (int i) {&lt;br /&gt;
    return const_cast&amp;lt;T&amp;amp;&amp;gt; (const_cast&amp;lt;A const*&amp;gt; (this).get(i) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
====reinterpret_cast====&lt;br /&gt;
Приводит любой указатель к любому указателю.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Point3 {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    double z;&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
Point3* p = ...;&lt;br /&gt;
double* p_x = reinterpret_cast&amp;lt;double*&amp;gt; (p);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Замечание: приведенный пример отработает корректно в случае если структура Point3 плотно упакована в памяти (см. опции компилятора).&lt;br /&gt;
====static_cast====&lt;br /&gt;
Используется для приведения&lt;br /&gt;
* числовых типов (аналогично C-style cast)&lt;br /&gt;
* указателей и ссылок для классов связанных наследованием&lt;br /&gt;
* пользовательских преобразований&lt;br /&gt;
Преобразование выполняется в момент компиляции и run-time проверки (как это есть в dynamic_cast) приведения типов нет, поэтому сложные приведения типов следует делать очень аккуратно. &lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {};&lt;br /&gt;
struct B : A {};&lt;br /&gt;
...&lt;br /&gt;
B* b;&lt;br /&gt;
A* a = static_cast&amp;lt;A*&amp;gt; (b);&lt;br /&gt;
b = static_cast&amp;lt;B*&amp;gt; (a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание: static_cast меняет указатель в зависимости от того какое у классов наследование (в отличии от reinterpret_cast), поэтому если будет forward declaration, то static_cast выдаст ошибку (на этапе компиляции):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A;&lt;br /&gt;
struct B;&lt;br /&gt;
B* b;&lt;br /&gt;
A* a = static_cast&amp;lt;A*&amp;gt;(b); // ошибка!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Общее замечание по разделу Приведение типов===&lt;br /&gt;
При программировании на С++ рекомендуется использовать C-style cast только в случаях приведения элементарных типов друг к другу.&lt;br /&gt;
&lt;br /&gt;
==RTTI==&lt;br /&gt;
RTTI расшифровывается как Run-time type information. Это механизм, позволяющий определять тип объекта в момент выполнения программы. В С++ данный механизм реализуется при помощи следующих элементов:&lt;br /&gt;
* оператор dynamic_cast (используется для преобразования полиморфных типов)&lt;br /&gt;
* оператор typeid (для точного определения типа объекта)&lt;br /&gt;
* класс type_info (для хранения информации, возвращаемой оператором typeid)&lt;br /&gt;
&lt;br /&gt;
Рассмотрим применение и синтаксис typeid и type_info на примере:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
A* a;&lt;br /&gt;
type_info&amp;amp; ti = typeid(a);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; ti.name() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Более сложный пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
struct A {};&lt;br /&gt;
struct B : A {};&lt;br /&gt;
...&lt;br /&gt;
A* a = new B();&lt;br /&gt;
typeid(a);  // A*&lt;br /&gt;
typeid(*a); // B&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У класса type_info помимо метода name (возвращающего строку - char*, характеризующую тип объекта) и операторов равенства/неравенства есть еще метод before, который позволяет упорядочивать экземпляры type_info и хранить их, например, в map.&lt;br /&gt;
&lt;br /&gt;
===dynamic_cast===&lt;br /&gt;
Позволяет приводить указатель или объект одного типа к указателю или ссылке на другой класс (связанный с первым через наследование).&lt;br /&gt;
В отличии от static_cast выполняется в run-time.&lt;br /&gt;
При ошибке приведения к указателю на тип dynamic_cast возвращает нулевой указатель, при ошибке приведения к ссылке на тип выбрасывается исключение bad_cast.&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {&lt;br /&gt;
	virtual void f() {}&lt;br /&gt;
};&lt;br /&gt;
struct B : A {&lt;br /&gt;
	virtual void f() {}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
A* pa = new B;&lt;br /&gt;
A* pa2 = new A;&lt;br /&gt;
&lt;br /&gt;
B* pb = dynamic_cast&amp;lt;B*&amp;gt;(pa);   // pb указывает на B&lt;br /&gt;
B* pb2 = dynamic_cast&amp;lt;B*&amp;gt;(pa2); // pb2 указывает на А, а не на В!&lt;br /&gt;
&lt;br /&gt;
pb-&amp;gt;f();&lt;br /&gt;
pb2-&amp;gt;f(); // ошибка на этапе исполнения!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание: При приведении к указателю на void возвращается указатель на начало блока.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Общие замечания по разделу RTTI:&lt;br /&gt;
* почти всегда можно обойтись без RTTI и чаще всего использование этого механизма говорит об ошибке проектирования&lt;br /&gt;
* на этапе отладки применение RTTI бывает полезно.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2._RTTI&amp;diff=1446</id>
		<title>Приведение типов. RTTI</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2._RTTI&amp;diff=1446"/>
				<updated>2012-06-11T00:34:10Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Приведение в стиле С++ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Приведение типов==&lt;br /&gt;
Приведение типов делится на C style cast и C++ style cast&lt;br /&gt;
===Приведение в стиле C===&lt;br /&gt;
Синтаксис приведения:&lt;br /&gt;
* (тип_к_которому_приводим) переменная&lt;br /&gt;
* тип_к_которому_приводим (переменная)&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int i = 10;&lt;br /&gt;
double d = (double) i;&lt;br /&gt;
float f = float(i);&lt;br /&gt;
char const* ch = &amp;quot;hello&amp;quot;;&lt;br /&gt;
string str = (string) ch;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Приведение в стиле С++===&lt;br /&gt;
В С++ для приведения типов используются следующие функции:&lt;br /&gt;
* const_cast&lt;br /&gt;
* reinterpret_cast&lt;br /&gt;
* static_cast&lt;br /&gt;
* dynamic_cast&lt;br /&gt;
Во всех случаях синтаксис приведения будет выглядеть следующим образом:&lt;br /&gt;
..._cast &amp;lt;тип_к_которому_приводим&amp;gt; (переменная)&lt;br /&gt;
&lt;br /&gt;
Рассмотрим первые три более подробно (dynamic_cast рассматривается в разделе RTTI).&lt;br /&gt;
====const_cast====&lt;br /&gt;
Добавляет/убирает у объекта константность. Если убрать константность у объекта, который был объявлен как константный, то при записи может возникнуть undefined behavior (в зависимости от типа объекта).&lt;br /&gt;
&lt;br /&gt;
Рассмотрим ситуацию, когда нам может пригодиться const_cast.&lt;br /&gt;
Предположим у нас класс A, в котором хранятся элементы типа Т. Пусть требуется реализовать метод get (константный и не константный), который по индексу i будет возвращать i-ый элемент. Можно описать реализацию только одного метода (константного), а второй реализовать через вызов первого при помощи const_cast:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
T const&amp;amp; get (int i) const;&lt;br /&gt;
T&amp;amp;       get (int i) {&lt;br /&gt;
    return const_cast&amp;lt;T&amp;amp;&amp;gt; (const_cast&amp;lt;A const*&amp;gt; (this).get(i) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
====reinterpret_cast====&lt;br /&gt;
Приводит любой указатель к любому указателю.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Point3 {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    double z;&lt;br /&gt;
};&lt;br /&gt;
...&lt;br /&gt;
Point3* p = ...;&lt;br /&gt;
double* p_x = reinterpret_cast&amp;lt;double*&amp;gt; (p);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Замечание: приведенный пример отработает корректно в случае если структура Point3 плотно упакована в памяти (см. опции компилятора).&lt;br /&gt;
====static_cast====&lt;br /&gt;
Используется для приведения&lt;br /&gt;
* числовых типов (аналогично C-style cast)&lt;br /&gt;
* указателей и ссылок для классов связанных наследованием&lt;br /&gt;
* пользовательских преобразований&lt;br /&gt;
Преобразование выполняется в момент компиляции и run-time проверки (как это есть в dynamic_cast) приведения типов нет, поэтому сложные приведения типов следует делать очень аккуратно. &lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {};&lt;br /&gt;
struct B : A {};&lt;br /&gt;
...&lt;br /&gt;
B* b;&lt;br /&gt;
A* a = static_cast&amp;lt;A*&amp;gt; (b);&lt;br /&gt;
b = static_cast&amp;lt;B*&amp;gt; (a);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание: static_cast меняет указатель в зависимости от того какое у классов наследование (в отличии от reinterpret_cast), поэтому если будет forward declaration, то static_cast выдаст ошибку (на этапе компиляции):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A;&lt;br /&gt;
struct B;&lt;br /&gt;
B* b;&lt;br /&gt;
A* a = static_cast&amp;lt;A*&amp;gt;(b); // ошибка!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Общее замечание по разделу Приведение типов==&lt;br /&gt;
При программировании на С++ рекомендуется использовать C-style cast только в случаях приведения элементарных типов друг к другу.&lt;br /&gt;
&lt;br /&gt;
==RTTI==&lt;br /&gt;
RTTI расшифровывается как Run-time type information. Это механизм, позволяющий определять тип объекта в момент выполнения программы. В С++ данный механизм реализуется при помощи следующих элементов:&lt;br /&gt;
* оператор dynamic_cast (используется для преобразования полиморфных типов)&lt;br /&gt;
* оператор typeid (для точного определения типа объекта)&lt;br /&gt;
* класс type_info (для хранения информации, возвращаемой оператором typeid)&lt;br /&gt;
&lt;br /&gt;
Рассмотрим применение и синтаксис typeid и type_info на примере:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
A* a;&lt;br /&gt;
type_info&amp;amp; ti = typeid(a);&lt;br /&gt;
std::cout &amp;lt;&amp;lt; ti.name() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Более сложный пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;typeinfo&amp;gt;&lt;br /&gt;
struct A {};&lt;br /&gt;
struct B : A {};&lt;br /&gt;
...&lt;br /&gt;
A* a = new B();&lt;br /&gt;
typeid(a);  // A*&lt;br /&gt;
typeid(*a); // B&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У класса type_info помимо метода name (возвращающего строку - char*, характеризующую тип объекта) и операторов равенства/неравенства есть еще метод before, который позволяет упорядочивать экземпляры type_info и хранить их, например, в map.&lt;br /&gt;
&lt;br /&gt;
===dynamic_cast===&lt;br /&gt;
Позволяет приводить указатель или объект одного типа к указателю или ссылке на другой класс (связанный с первым через наследование).&lt;br /&gt;
В отличии от static_cast выполняется в run-time.&lt;br /&gt;
При ошибке приведения к указателю на тип dynamic_cast возвращает нулевой указатель, при ошибке приведения к ссылке на тип выбрасывается исключение bad_cast.&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A {&lt;br /&gt;
	virtual void f() {}&lt;br /&gt;
};&lt;br /&gt;
struct B : A {&lt;br /&gt;
	virtual void f() {}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
A* pa = new B;&lt;br /&gt;
A* pa2 = new A;&lt;br /&gt;
&lt;br /&gt;
B* pb = dynamic_cast&amp;lt;B*&amp;gt;(pa);   // pb указывает на B&lt;br /&gt;
B* pb2 = dynamic_cast&amp;lt;B*&amp;gt;(pa2); // pb2 указывает на А, а не на В!&lt;br /&gt;
&lt;br /&gt;
pb-&amp;gt;f();&lt;br /&gt;
pb2-&amp;gt;f(); // ошибка на этапе исполнения!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание: При приведении к указателю на void возвращается указатель на начало блока.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Общие замечания по разделу RTTI:&lt;br /&gt;
* почти всегда можно обойтись без RTTI и чаще всего использование этого механизма говорит об ошибке проектирования&lt;br /&gt;
* на этапе отладки применение RTTI бывает полезно.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%BD%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&amp;diff=1445</id>
		<title>Указатели на функции</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%BD%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&amp;diff=1445"/>
				<updated>2012-06-10T23:35:03Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Указатели на функции в С++ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Указатели на функции в С ==&lt;br /&gt;
Рассмотрим метод qsort, который имеет прототип:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void qsort(void *base, size_t nmemb, size_t size, &lt;br /&gt;
           int (*compare)(const void *, const void *));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
где &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int (*compare)(const void *a, const void *b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
указатель на функцию, которая имеет 2 параметра, и возращает значение:&lt;br /&gt;
* &amp;gt; 0, если a &amp;gt; b &lt;br /&gt;
* = 0, если a == b&lt;br /&gt;
* &amp;lt; 0, если a &amp;lt; b&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
	int m_age;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Создадим объект структуры Person.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Person *m;&lt;br /&gt;
qsort(m, count, sizeof(Person), &amp;amp;(byage));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Определим функцию byage:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int byage(void const *p1, void const *p2) {&lt;br /&gt;
	return ((Person *)p1)-&amp;gt;age - ((Person *)p2)-&amp;gt;age;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание:&lt;br /&gt;
&lt;br /&gt;
В С нет проверки типов.&lt;br /&gt;
&lt;br /&gt;
Замечание:&lt;br /&gt;
* При объявлении указателя на функцию можем не писать параметры, то есть&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int(*)(void const *, void const *);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Можно присвоить указателю на функцию значение 0&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void (*f)(void *, size_t , size_t , int (*)(const void *, const void *)) = 0;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для таких конструкций можно использовать typedef &amp;lt;...&amp;gt;, где второе имя не будет указано, так как в его роли выступит f в левой части выражения.&lt;br /&gt;
* Присваивание&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
f = &amp;amp;qsort;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Вызов&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
f(m, count, sizeof(Person), &amp;amp;byage);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указатели на функции в С++ ==&lt;br /&gt;
&lt;br /&gt;
Одно из отличий С и С++ - в С++ есть перегрузка. Тогда получается&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
F f = qsort; // должна вызываться та, что подойдет лучше всего&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Вопрос:&lt;br /&gt;
&lt;br /&gt;
Как происходит работа с шаблонными функциями?&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два примера.&lt;br /&gt;
&lt;br /&gt;
Пример 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;class It, class F&amp;gt; void A(It p, It q, F f);&lt;br /&gt;
A(v.begin(), v.end(), (int(*)(int))sqrt); // необходимо приведение типов&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt; T sqrt(T *);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Нам необходимо проинстанциировать функцию, для этого существует несколько способов:&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
sqrt(0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template sqrt&amp;lt;int&amp;gt;; // явно для T = int&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В результате, метод A мы можем вызывать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
A(v.begin(), v.end(), sqrt&amp;lt;int&amp;gt;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопрос:&lt;br /&gt;
Как получить указатели на члены класса?&lt;br /&gt;
Ответ:&lt;br /&gt;
Рассмотрим пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
	int m_age;&lt;br /&gt;
	int m_salary;&lt;br /&gt;
	string m_name;&lt;br /&gt;
	string name() {&lt;br /&gt;
		return m_name;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int Person::(*p) = &amp;amp;Person::m_age;&lt;br /&gt;
string (Person::*f)() const = &amp;amp;Person::name;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее имеем&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Person pers;&lt;br /&gt;
(pers.*p) = 10;&lt;br /&gt;
(pers.*f)();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопрос:&lt;br /&gt;
&lt;br /&gt;
Мы имеем указатель на член класса. Можем ли мы его передавать как параметр функции?&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
&lt;br /&gt;
Да, можем. Пример,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct by_field {&lt;br /&gt;
	by_field(int Person::*field)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание:&lt;br /&gt;
Указатели на члены класса не приводяться ни к чему. Они могут проверяться на равенство 0.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%BD%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&amp;diff=1444</id>
		<title>Указатели на функции</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%BD%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8&amp;diff=1444"/>
				<updated>2012-06-10T23:21:51Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Указатели на функции в С */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Указатели на функции в С ==&lt;br /&gt;
Рассмотрим метод qsort, который имеет прототип:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void qsort(void *base, size_t nmemb, size_t size, &lt;br /&gt;
           int (*compare)(const void *, const void *));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
где &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int (*compare)(const void *a, const void *b)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
указатель на функцию, которая имеет 2 параметра, и возращает значение:&lt;br /&gt;
* &amp;gt; 0, если a &amp;gt; b &lt;br /&gt;
* = 0, если a == b&lt;br /&gt;
* &amp;lt; 0, если a &amp;lt; b&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
	int m_age;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Создадим объект структуры Person.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Person *m;&lt;br /&gt;
qsort(m, count, sizeof(Person), &amp;amp;(byage));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Определим функцию byage:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int byage(void const *p1, void const *p2) {&lt;br /&gt;
	return ((Person *)p1)-&amp;gt;age - ((Person *)p2)-&amp;gt;age;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание:&lt;br /&gt;
&lt;br /&gt;
В С нет проверки типов.&lt;br /&gt;
&lt;br /&gt;
Замечание:&lt;br /&gt;
* При объявлении указателя на функцию можем не писать параметры, то есть&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int(*)(void const *, void const *);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Можно присвоить указателю на функцию значение 0&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void (*f)(void *, size_t , size_t , int (*)(const void *, const void *)) = 0;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для таких конструкций можно использовать typedef &amp;lt;...&amp;gt;, где второе имя не будет указано, так как в его роли выступит f в левой части выражения.&lt;br /&gt;
* Присваивание&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
f = &amp;amp;qsort;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Вызов&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
f(m, count, sizeof(Person), &amp;amp;byage);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Указатели на функции в С++ ==&lt;br /&gt;
&lt;br /&gt;
Одно из отличий С и С++ - в С++ есть перегрузка. Тогда получается&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
F f = qsort; // должна вызываться та, что подойдет лучше всего&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Вопрос:&lt;br /&gt;
&lt;br /&gt;
Как происходит работа с шаблонными функциями?&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два примера.&lt;br /&gt;
&lt;br /&gt;
Пример 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;class It, class F&amp;gt; void A(It p, It q, F f);&lt;br /&gt;
A(v.begin(), v.end(), (int(*)(int))sqrt); // необходимо приведение типов&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt; T sqrt(T *);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Нам необходимо проинстанциировать функцию, для этого существует несколько способов:&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
sqrt(0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template sqrt&amp;lt;int&amp;gt;; // явно для T = int&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В результате, метод A мы можем вызывать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
A(v.begin(), v.end(), sqrt&amp;lt;int&amp;gt;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопрос:&lt;br /&gt;
Как получить указатели на члены класса?&lt;br /&gt;
Ответ:&lt;br /&gt;
Рассмотрим пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Person {&lt;br /&gt;
	int m_age;&lt;br /&gt;
	int m_salary;&lt;br /&gt;
	string m_name;&lt;br /&gt;
	string name() {&lt;br /&gt;
		return m_name;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int Person::(*p) = &amp;amp;Person::m_age;&lt;br /&gt;
string (Person::*f)() const = &amp;amp;Person::name;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее имеем&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Person pers;&lt;br /&gt;
(pers.*p) = 10;&lt;br /&gt;
(pers.*f)();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопрос:&lt;br /&gt;
&lt;br /&gt;
Мы имеем указатель на мембер класса. Можем ли мы его передавать как параметр функции?&lt;br /&gt;
&lt;br /&gt;
Ответ:&lt;br /&gt;
&lt;br /&gt;
Да, можем. Пример,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct by_field {&lt;br /&gt;
	by_field(int Person::*field)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Замечание:&lt;br /&gt;
Указатели на мемберы не приводяться ник чему. Они могут проверяться на равенство 0.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80%D1%8B._Namespaces&amp;diff=1443</id>
		<title>Функторы. Namespaces</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80%D1%8B._Namespaces&amp;diff=1443"/>
				<updated>2012-06-10T23:04:19Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Namespaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Функторы ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
find_if (p, q, Func); //ищет первый элемент, для которого функтор вернёт true&lt;br /&gt;
&lt;br /&gt;
// Реализация функтора, который проверяет деление на 7.&lt;br /&gt;
struct Divby7 {&lt;br /&gt;
  bool operator()(int i) const {&lt;br /&gt;
    return i%7==0;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Реализация функтора, который проверяет деление на любое число, которое будет передано в конструктор.&lt;br /&gt;
struct Divby {&lt;br /&gt;
  Divby(int k) : k(k){}&lt;br /&gt;
  bool operator()(int i) const {&lt;br /&gt;
    return i%k==0;&lt;br /&gt;
  }&lt;br /&gt;
  const int k;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно писать find_if(p, q, Divby(5)), тогда в последовательности будет найден первый элемент, делящийся на 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
stable_sort(p, qcomp_by_abs());&lt;br /&gt;
&lt;br /&gt;
struct comp_by_abs {&lt;br /&gt;
  bool operator()(int a, int b) const {&lt;br /&gt;
    return abs(a) &amp;lt; abs(b);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Divby - унарный предикат (одноместный функтор).&lt;br /&gt;
comp_by_abs - бинарный предикат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
transform(p,q,out, add(7));&lt;br /&gt;
&lt;br /&gt;
struct add {&lt;br /&gt;
  add(int k): k(k) {}&lt;br /&gt;
  int operator()(int a) const {&lt;br /&gt;
    return a+7;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это уже непосредственно функтор (не предикат, поскольку возвращает не 0/1).&lt;br /&gt;
&lt;br /&gt;
Стандартные функторы: minus, plus, divides, modulus, multiplies, logical_and, logical_or, logical_not.&lt;br /&gt;
Бинарные предикаты(шаблонные): less, greater, less_equal, greater_equal, not_equal_to, equal_to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
find_if(p, q, bind1st(not_equal_to&amp;lt;int&amp;gt;(), 7)); // первый элемент, не равный 7&lt;br /&gt;
find_if(p, q, bind2nd(greater&amp;lt;int&amp;gt;(), 7)); // первый элемент, больший 7&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме bind1st, bind2nd есть еще not1, not2.&lt;br /&gt;
Для того, чтобы пользовательские функторы можно было биндить, необходимо наследовать их от стандартных классов.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Divby : unary_function&amp;lt;int, bool&amp;gt; {&lt;br /&gt;
   ...&lt;br /&gt;
}  &lt;br /&gt;
struct comp_by_abs : binary_function&amp;lt;int, int, bool&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mem_fun - обёртка для member-функций (для указателей). &lt;br /&gt;
mem_fun_ref - то же самое для ссылок.&lt;br /&gt;
ptr_fun - обёртка для любой функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
for_each(p, q, mem_fun_ref(vector&amp;lt;int&amp;gt;::clear));&lt;br /&gt;
not1(ptr_fun(is_add()));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Библиотека boost::bind:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
boost::bind(vector&amp;lt;int&amp;gt;::resize,_1, 100,3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Namespaces ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int max(int, int);&lt;br /&gt;
 double max(double, double);&lt;br /&gt;
 namespace au {&lt;br /&gt;
    void f(){}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы вызвать f, нужно написать au::f();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 namespace noc {&lt;br /&gt;
  void g(){} &lt;br /&gt;
 }&lt;br /&gt;
 namespace au {&lt;br /&gt;
   void g(){}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
namespace не является чем-то целостным. Пространства имён можно вкладывать друг в друга.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace Ru {&lt;br /&gt;
  namespace Spb {&lt;br /&gt;
    namespace au {&lt;br /&gt;
      int f();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  namespace Msk {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Ru::spb::au::f();&lt;br /&gt;
::f(); //функция из глобального namespace&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в Msk будет еще Ru, то чтобы вызвать функцию из spb из msk, надо будет писать не Ru::spb, а ::Ru::spb (коллизия двух Ru).&lt;br /&gt;
&lt;br /&gt;
Поиск:&lt;br /&gt;
* ищет имя в текущем namespace;&lt;br /&gt;
* если не нашли, переходим выше;&lt;br /&gt;
* если нашли, запускаем перегрузку.&lt;br /&gt;
При этом поиск просматривает ВСЕ имена (переменные, функции, классы...), так как синтаксически не ясно, что именно требуется. Функции находятся независимо от количества параметров. Если искали функцию, а наткнулись на соответствующие имя класса, происходит ошибка.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace Ru {&lt;br /&gt;
  // определена g(a,b)&lt;br /&gt;
  namespace spb {&lt;br /&gt;
    // определена g(a) &lt;br /&gt;
    namespace spbtele { &lt;br /&gt;
      // вызываем g(a,b) &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  namespace msk {}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В предыдущем примере поиск остановиться в spb. Поскольку там тоже есть g. Чтобы избежать такое, надо в spb записать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
  using ::Ru::g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
НЕ НАДО=НЕЛЬЗЯ писать using namespaсe std;&lt;br /&gt;
&lt;br /&gt;
Безымянный namespace: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace {&lt;br /&gt;
  struct test {&lt;br /&gt;
    ...&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Появится уникальный namespace для каждого .cpp файла. Это позвляет создавать маленькие структуры, не боясь перекрытия имен. Компилятор авторматически добавит после него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
using namespace &amp;lt;name&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пространствам имён можно задавать псевдонимы:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace a = ru::spb::au;&lt;br /&gt;
a::f();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ADL - argument dependent lookup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace g { &lt;br /&gt;
  struct complex {};&lt;br /&gt;
  complex operator+();&lt;br /&gt;
}&lt;br /&gt;
g::complex a, b;   &lt;br /&gt;
a = a + b; //как ни странно, это сработает :)&lt;br /&gt;
а = g::operator+(a, b);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Поиск имён происходит там, где мы находимся, а также и в namespace аргументов (это первый шаг). Этот поиск называется поиском Кёнига.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80%D1%8B._Namespaces&amp;diff=1442</id>
		<title>Функторы. Namespaces</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80%D1%8B._Namespaces&amp;diff=1442"/>
				<updated>2012-06-10T23:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Namespaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Функторы ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
find_if (p, q, Func); //ищет первый элемент, для которого функтор вернёт true&lt;br /&gt;
&lt;br /&gt;
// Реализация функтора, который проверяет деление на 7.&lt;br /&gt;
struct Divby7 {&lt;br /&gt;
  bool operator()(int i) const {&lt;br /&gt;
    return i%7==0;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Реализация функтора, который проверяет деление на любое число, которое будет передано в конструктор.&lt;br /&gt;
struct Divby {&lt;br /&gt;
  Divby(int k) : k(k){}&lt;br /&gt;
  bool operator()(int i) const {&lt;br /&gt;
    return i%k==0;&lt;br /&gt;
  }&lt;br /&gt;
  const int k;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно писать find_if(p, q, Divby(5)), тогда в последовательности будет найден первый элемент, делящийся на 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
stable_sort(p, qcomp_by_abs());&lt;br /&gt;
&lt;br /&gt;
struct comp_by_abs {&lt;br /&gt;
  bool operator()(int a, int b) const {&lt;br /&gt;
    return abs(a) &amp;lt; abs(b);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Divby - унарный предикат (одноместный функтор).&lt;br /&gt;
comp_by_abs - бинарный предикат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
transform(p,q,out, add(7));&lt;br /&gt;
&lt;br /&gt;
struct add {&lt;br /&gt;
  add(int k): k(k) {}&lt;br /&gt;
  int operator()(int a) const {&lt;br /&gt;
    return a+7;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это уже непосредственно функтор (не предикат, поскольку возвращает не 0/1).&lt;br /&gt;
&lt;br /&gt;
Стандартные функторы: minus, plus, divides, modulus, multiplies, logical_and, logical_or, logical_not.&lt;br /&gt;
Бинарные предикаты(шаблонные): less, greater, less_equal, greater_equal, not_equal_to, equal_to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
find_if(p, q, bind1st(not_equal_to&amp;lt;int&amp;gt;(), 7)); // первый элемент, не равный 7&lt;br /&gt;
find_if(p, q, bind2nd(greater&amp;lt;int&amp;gt;(), 7)); // первый элемент, больший 7&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме bind1st, bind2nd есть еще not1, not2.&lt;br /&gt;
Для того, чтобы пользовательские функторы можно было биндить, необходимо наследовать их от стандартных классов.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Divby : unary_function&amp;lt;int, bool&amp;gt; {&lt;br /&gt;
   ...&lt;br /&gt;
}  &lt;br /&gt;
struct comp_by_abs : binary_function&amp;lt;int, int, bool&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mem_fun - обёртка для member-функций (для указателей). &lt;br /&gt;
mem_fun_ref - то же самое для ссылок.&lt;br /&gt;
ptr_fun - обёртка для любой функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
for_each(p, q, mem_fun_ref(vector&amp;lt;int&amp;gt;::clear));&lt;br /&gt;
not1(ptr_fun(is_add()));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Библиотека boost::bind:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
boost::bind(vector&amp;lt;int&amp;gt;::resize,_1, 100,3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Namespaces ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int max(int, int);&lt;br /&gt;
 double max(double, double);&lt;br /&gt;
 namespace au {&lt;br /&gt;
    void f(){}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы вызвать f, нужно написать au::f();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 namespace noc {&lt;br /&gt;
  void g(){} &lt;br /&gt;
 }&lt;br /&gt;
 namespace au {&lt;br /&gt;
   void g(){}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
namespace не является чем-то целостным. Пространства имён можно вкладывать друг в друга.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace Ru {&lt;br /&gt;
  namespace Spb {&lt;br /&gt;
    namespace au {&lt;br /&gt;
      int f();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  namespace Msk {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Ru::spb::au::f();&lt;br /&gt;
::f(); //функция из глобального namespace&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в Msk будет еще Ru, то чтобы вызвать функцию из spb из msk, надо будет писать не Ru::spb, а ::Ru::spb (коллизия двух Ru).&lt;br /&gt;
&lt;br /&gt;
Поиск:&lt;br /&gt;
* ищет имя в текущем namespace;&lt;br /&gt;
* если не нашли, переходим выше;&lt;br /&gt;
* если нашли, запускаем перегрузку.&lt;br /&gt;
При этом поиск просматривает ВСЕ имена (переменные, функции, классы...), так как синтаксически не ясно, что именно требуется. Функции находятся независимо от количества параметров. Если искали функцию, а наткнулись на соответствующие имя класса, происходит ошибка.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace Ru {&lt;br /&gt;
  // определена g(a,b)&lt;br /&gt;
  namespace spb {&lt;br /&gt;
    // определена g(a) &lt;br /&gt;
    namespace spbtele { &lt;br /&gt;
      // вызываем g(a,b) &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  namespace msk {}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В предыдущем примере поиск остановиться в spb. Поскольку там тоже есть g. Чтобы избежать такое, надо в spb записать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
  using ::Ru::g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
НЕ НАДО=НЕЛЬЗЯ писать using namespaсe std;&lt;br /&gt;
&lt;br /&gt;
Безымянный namespace: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace {&lt;br /&gt;
  struct test {&lt;br /&gt;
    ...&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Появится уникальный namespace для каждого .cpp файла. Это позвляет создавать маленькие структуры, не боясь перекрытия имен. Компилятор авторматически добавит после него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
using namespace &amp;lt;name&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пространствам имён можно задавать псевдонимы:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace a = ru::spb::au;&lt;br /&gt;
a::f();.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ADL = argument dependent lookup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace g { &lt;br /&gt;
  struct complex {};&lt;br /&gt;
  complex operator+();&lt;br /&gt;
}&lt;br /&gt;
g::complex a, b;   &lt;br /&gt;
a = a + b; //как ни странно, это сработает :)&lt;br /&gt;
а = g::operator+(a, b);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
Поиск имён происходит там, где мы находимся, а также и в namespace аргументов (это первый шаг). Этот поиск называется поиском Кёнига.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80%D1%8B._Namespaces&amp;diff=1441</id>
		<title>Функторы. Namespaces</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80%D1%8B._Namespaces&amp;diff=1441"/>
				<updated>2012-06-10T22:55:12Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Namespaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Функторы ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
find_if (p, q, Func); //ищет первый элемент, для которого функтор вернёт true&lt;br /&gt;
&lt;br /&gt;
// Реализация функтора, который проверяет деление на 7.&lt;br /&gt;
struct Divby7 {&lt;br /&gt;
  bool operator()(int i) const {&lt;br /&gt;
    return i%7==0;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Реализация функтора, который проверяет деление на любое число, которое будет передано в конструктор.&lt;br /&gt;
struct Divby {&lt;br /&gt;
  Divby(int k) : k(k){}&lt;br /&gt;
  bool operator()(int i) const {&lt;br /&gt;
    return i%k==0;&lt;br /&gt;
  }&lt;br /&gt;
  const int k;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно писать find_if(p, q, Divby(5)), тогда в последовательности будет найден первый элемент, делящийся на 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
stable_sort(p, qcomp_by_abs());&lt;br /&gt;
&lt;br /&gt;
struct comp_by_abs {&lt;br /&gt;
  bool operator()(int a, int b) const {&lt;br /&gt;
    return abs(a) &amp;lt; abs(b);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Divby - унарный предикат (одноместный функтор).&lt;br /&gt;
comp_by_abs - бинарный предикат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
transform(p,q,out, add(7));&lt;br /&gt;
&lt;br /&gt;
struct add {&lt;br /&gt;
  add(int k): k(k) {}&lt;br /&gt;
  int operator()(int a) const {&lt;br /&gt;
    return a+7;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это уже непосредственно функтор (не предикат, поскольку возвращает не 0/1).&lt;br /&gt;
&lt;br /&gt;
Стандартные функторы: minus, plus, divides, modulus, multiplies, logical_and, logical_or, logical_not.&lt;br /&gt;
Бинарные предикаты(шаблонные): less, greater, less_equal, greater_equal, not_equal_to, equal_to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
find_if(p, q, bind1st(not_equal_to&amp;lt;int&amp;gt;(), 7)); // первый элемент, не равный 7&lt;br /&gt;
find_if(p, q, bind2nd(greater&amp;lt;int&amp;gt;(), 7)); // первый элемент, больший 7&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме bind1st, bind2nd есть еще not1, not2.&lt;br /&gt;
Для того, чтобы пользовательские функторы можно было биндить, необходимо наследовать их от стандартных классов.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Divby : unary_function&amp;lt;int, bool&amp;gt; {&lt;br /&gt;
   ...&lt;br /&gt;
}  &lt;br /&gt;
struct comp_by_abs : binary_function&amp;lt;int, int, bool&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mem_fun - обёртка для member-функций (для указателей). &lt;br /&gt;
mem_fun_ref - то же самое для ссылок.&lt;br /&gt;
ptr_fun - обёртка для любой функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
for_each(p, q, mem_fun_ref(vector&amp;lt;int&amp;gt;::clear));&lt;br /&gt;
not1(ptr_fun(is_add()));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Библиотека boost::bind:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
boost::bind(vector&amp;lt;int&amp;gt;::resize,_1, 100,3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Namespaces ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 int max(int, int);&lt;br /&gt;
 double max(double, double);&lt;br /&gt;
 namespace au {&lt;br /&gt;
    void f(){}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы вызвать f, нужно написать au::f();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 namespace noc {&lt;br /&gt;
  void g(){} &lt;br /&gt;
 }&lt;br /&gt;
 namespace au {&lt;br /&gt;
   void g(){}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
namespace не является чем-то целостным. Пространства имён можно вкладывать друг в друга.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace Ru {&lt;br /&gt;
  namespace Spb {&lt;br /&gt;
    namespace au {&lt;br /&gt;
      int f();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  namespace Msk {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
Ru::spb::au::f();&lt;br /&gt;
::f(); //функция из глобального namespace&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в Msk будет еще Ru, то чтобы вызвать функцию из spb из msk, надо будет писать не Ru::spb, а ::Ru::spb (коллизия двух Ru).&lt;br /&gt;
&lt;br /&gt;
Поиск:&lt;br /&gt;
* ищет имя в текущем namespace;&lt;br /&gt;
* если не нашли, переходим выше;&lt;br /&gt;
* если нашли, запускаем перегрузку.&lt;br /&gt;
При этом поиск просматривает ВСЕ имена (переменные, функции, классы...), так как синтаксически не ясно, что именно требуется. Функции находятся независимо от количества параметров. Если искали функцию, а наткнулись на соответствующие имя класса, происходит ошибка.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace Ru {&lt;br /&gt;
  // определена g(a,b)&lt;br /&gt;
  namespace spb {&lt;br /&gt;
    // определена g(a) &lt;br /&gt;
    namespace spbtele { &lt;br /&gt;
      // вызываем g(a,b) &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  namespace msk {}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В предыдущем примере поиск остановиться в spb. Поскольку там тоже есть g. Чтобы избежать такое, надо в spb записать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
  using ::Ru::g;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
НЕ НАДО=НЕЛЬЗЯ писать using namespaсe std;&lt;br /&gt;
&lt;br /&gt;
Безымянный namespace: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace {&lt;br /&gt;
  struct test {&lt;br /&gt;
    ...&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Появится уникальный namespace для каждого .cpp файла. Это позвляет создавать маленькие структуры, не боясь перекрытия имен. Компилятор авторматически добавит после него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
using namespace &amp;lt;name&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пространствам имён можно задавать псевдонимы:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace a = ru::spb::au;&lt;br /&gt;
a::f();.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ADL = argument dependent lookup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
namespace g { &lt;br /&gt;
  struct complex {};&lt;br /&gt;
  complex operator+();&lt;br /&gt;
}&lt;br /&gt;
g::complex a, b;   &lt;br /&gt;
a = a + b; //как ни странно, это сработает :)&lt;br /&gt;
а = g::operator+(a, b);&lt;br /&gt;
   &lt;br /&gt;
Поиск имён происходит там, где мы находимся, а также и в namespace аргументов (это первый шаг). Этот поиск называется поиском Кёнига.&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1417</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1417"/>
				<updated>2012-05-12T10:35:03Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Практические задания - группа Москвина */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]]&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]]&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]] 13.04.2012&lt;br /&gt;
* [[Медиа:Fpc10.pdf|Лекция №10]] 27.04.2012&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]] ([[Медиа:Fp07.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]] ([[Медиа:Fp08.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc09pr.pdf|Задание №9]] ([[Медиа:Fp09.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc10pr.pdf|Задание №10]] ([[Медиа:Fp10.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc09pr.pdf&amp;diff=1416</id>
		<title>Файл:Fpc09pr.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc09pr.pdf&amp;diff=1416"/>
				<updated>2012-05-12T10:34:11Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Spring 2012 (Practice 9)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Spring 2012 (Practice 9)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1415</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1415"/>
				<updated>2012-05-12T10:33:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Лекции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]]&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]]&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]] 13.04.2012&lt;br /&gt;
* [[Медиа:Fpc10.pdf|Лекция №10]] 27.04.2012&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]]&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]]&lt;br /&gt;
* [[Медиа:Fpc09pr.pdf|Задание №9]] ([[Медиа:Fp09.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc10pr.pdf|Задание №10]] ([[Медиа:Fp10.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc10.pdf&amp;diff=1414</id>
		<title>Файл:Fpc10.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc10.pdf&amp;diff=1414"/>
				<updated>2012-05-12T10:32:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Spring 2012 (Lecture 10)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Spring 2012 (Lecture 10)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc10pr.pdf&amp;diff=1413</id>
		<title>Файл:Fpc10pr.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc10pr.pdf&amp;diff=1413"/>
				<updated>2012-05-12T10:31:39Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Spring 2012 (Practice 10)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Spring 2012 (Practice 10)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1412</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1412"/>
				<updated>2012-05-12T10:30:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Лекции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]]&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]]&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]]&lt;br /&gt;
* [[Медиа:Fpc10.pdf|Лекция №10]] 27.04.2012&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]]&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]]&lt;br /&gt;
* [[Медиа:Fpc09pr.pdf|Задание №9]] ([[Медиа:Fp09.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc10pr.pdf|Задание №10]] ([[Медиа:Fp10.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1411</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1411"/>
				<updated>2012-05-12T10:28:55Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Практические задания - группа Москвина */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]]&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]]&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]]&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]]&lt;br /&gt;
* [[Медиа:Fpc09pr.pdf|Задание №9]] ([[Медиа:Fp09.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc10pr.pdf|Задание №10]] ([[Медиа:Fp10.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=1408</id>
		<title>Алгоритмы и структуры данных</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=1408"/>
				<updated>2012-05-05T22:58:08Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Интересное в сети */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Интересное в сети ==&lt;br /&gt;
*[http://habrahabr.ru/post/113642/ Быстрое умножение многочленов при помощи преобразования Фурье с оптимизациями и примерами применения]&lt;br /&gt;
*[http://habrahabr.ru/post/140837/ Нечеткий кластерный анализ на примере социально-экономических показателей крупных городов России] (Machine Learning)&lt;br /&gt;
*[http://www.lektorium.tv/course/?id=22823 Видео-курс лекций за 1 семестр из CSC]&lt;br /&gt;
*[http://www.lektorium.tv/course/?id=22843 Видео-курс лекций за 2 семестр из CSC]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1328</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1328"/>
				<updated>2012-04-17T19:18:43Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Activities =&lt;br /&gt;
&lt;br /&gt;
* Fall 2011: Recommender System&lt;br /&gt;
* Spring 2012: [[НИР#Конфигуратор контейнеров AndroidVM|AndroidVM Configurator]], [[AVMConf_Kazenyuk|Weekly reports]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=DevDays&amp;diff=1327</id>
		<title>DevDays</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=DevDays&amp;diff=1327"/>
				<updated>2012-04-17T19:17:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://twitter.com/#!/search/%23AUDevDays #AUDevDays]&lt;br /&gt;
&lt;br /&gt;
==Команды==&lt;br /&gt;
* [[Android_Accelerometer|Акселерометр в Android]]: Мария Фофанова, Алина Певзнер &lt;br /&gt;
* [[Cheque_recognizer|Cheque (Receipt) recognizer]]: Дмитрий Шерставин, Залим Башоров, Семен Мартынов, Сергей Казенюк&lt;br /&gt;
* [[Android_Notification|Оповещения с Android]]: Михаил Кринкин, Алексей Коровин, Александр Опейкин, Сергей Лазарев, Ксения Крашенинникова&lt;br /&gt;
* [[Geo_Time_Tracker|Geo Time Tracker for Android]]: Евгений Краско, Алексей Кудинкин, Анна Ждан, Сорокин Артём, Ярослав Лепенькин &lt;br /&gt;
* [[DJVU_Formatter|DJVU форматер под маленькие разрешения экрана]]: Василий Кононенко, Дмитрий Бандурин&lt;br /&gt;
&lt;br /&gt;
==Описание Проектов==&lt;br /&gt;
* [[Android_Accelerometer|Акселерометр в Android]]&lt;br /&gt;
* [[Cheque_recognizer|Chèque (Receipt) recognizer]]&lt;br /&gt;
* [[Android_Notification|Оповещения с Android]]&lt;br /&gt;
* [[Geo_Tracker|Geo Tracker]]&lt;br /&gt;
* [[DJVU_Formatter|DJVU форматер под маленькие разрешения экрана]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1305</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1305"/>
				<updated>2012-04-12T21:54:19Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Практические задания - группа Москвина */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]]&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]]&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc07pr.pdf|Задание №7]]&lt;br /&gt;
* [[Медиа:Fpc08pr.pdf|Задание №8]]&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc08pr.pdf&amp;diff=1304</id>
		<title>Файл:Fpc08pr.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc08pr.pdf&amp;diff=1304"/>
				<updated>2012-04-12T21:53:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Practice #8 (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Practice #8 (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc07pr.pdf&amp;diff=1303</id>
		<title>Файл:Fpc07pr.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc07pr.pdf&amp;diff=1303"/>
				<updated>2012-04-12T21:53:11Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Practice #7 (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Practice #7 (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1302</id>
		<title>FunctionalProgramming</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=FunctionalProgramming&amp;diff=1302"/>
				<updated>2012-04-12T21:51:42Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Лекции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Лекции ==&lt;br /&gt;
* [[Медиа:Fpc01.pdf|Лекция №1]] 10.02.2012&lt;br /&gt;
* [[Медиа:Fpc02.pdf|Лекция №2]] 17.02.2012&lt;br /&gt;
* [[Медиа:Fpc03.pdf|Лекция №3]] 24.02.2012&lt;br /&gt;
* [[Медиа:Fpc04.pdf|Лекция №4]] 02.03.2012&lt;br /&gt;
* [[Медиа:Fpc05.pdf|Лекция №5]] 11.03.2012&lt;br /&gt;
* [[Медиа:Fpc06.pdf|Лекция №6]] 23.03.2012&lt;br /&gt;
* [[Медиа:Fpc07.pdf|Лекция №7]]&lt;br /&gt;
* [[Медиа:Fpc08.pdf|Лекция №8]]&lt;br /&gt;
* [[Медиа:Fpc09.pdf|Лекция №9]]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Москвина ==&lt;br /&gt;
* [[Медиа:Fpc01pr.pdf|Задание №1]]&lt;br /&gt;
* [[Медиа:Fpc02pr.pdf|Задание №2]]&lt;br /&gt;
* [[Медиа:Fpc03pr.pdf|Задание №3]]&lt;br /&gt;
* [[Медиа:Fpc04pr.pdf|Задание №4]] ([[Медиа:Fp04.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc05pr.pdf|Задание №5]] ([[Медиа:Fp05.hs.bz2|Пример]])&lt;br /&gt;
* [[Медиа:Fpc06pr.pdf|Задание №6]] ([[Медиа:Fp06.hs.bz2|Пример]])&lt;br /&gt;
&lt;br /&gt;
*[https://docs.google.com/spreadsheet/ccc?key=0AoUO7sfz2x3ydFdfTFZNMmlUajdldmVDdlNZaFdTU0E&amp;amp;pli=1#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
== Практические задания - группа Исаева ==&lt;br /&gt;
* [http://docs.google.com/spreadsheet/ccc?key=0AiOIfVRpxaJ4dDNZOFV3MEZSWUN0QmZ2N2VhbXNKRVE#gid=0 Результаты]&lt;br /&gt;
&lt;br /&gt;
* [[Медиа:Fph02i.pdf|Домашнее задание 2]] ([[Медиа:Fpp02i.pdf|Практическое занятие 2]])&lt;br /&gt;
* [http://docs.google.com/file/d/0ByOIfVRpxaJ4LVNWS3M2ZEpRYk83SEVROV9rZUV2QQ/edit?pli=1 Домашнее задание 3] ([http://docs.google.com/file/d/0ByOIfVRpxaJ4WE9Uc0pJaUxSa1NqRDlTY0ViZEZmZw/edit Практическое занятие 3])&lt;br /&gt;
* [[Медиа:Fph04i.pdf|Домашнее задание 4]]&lt;br /&gt;
* [[Медиа:Fph05i.pdf|Домашнее задание 5]]&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/9/93/FPCourseOutline.pdf FPCourseOutline.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
[http://mit.spbau.ru/sewiki/images/6/6b/Books.pdf Books.pdf]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc09.pdf&amp;diff=1301</id>
		<title>Файл:Fpc09.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc09.pdf&amp;diff=1301"/>
				<updated>2012-04-12T21:50:45Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Lecture #9 (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Lecture #9 (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc08.pdf&amp;diff=1300</id>
		<title>Файл:Fpc08.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc08.pdf&amp;diff=1300"/>
				<updated>2012-04-12T21:50:25Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Lecture #8 (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Lecture #8 (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc07.pdf&amp;diff=1299</id>
		<title>Файл:Fpc07.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Fpc07.pdf&amp;diff=1299"/>
				<updated>2012-04-12T21:49:58Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Functional Programming Lecture #7 (Spring 2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Programming Lecture #7 (Spring 2012)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1290</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1290"/>
				<updated>2012-04-11T11:28:57Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Research Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Research Projects =&lt;br /&gt;
&lt;br /&gt;
* Fall 2011: Recommender System&lt;br /&gt;
* Spring 2012: [[НИР#Конфигуратор контейнеров AndroidVM|AndroidVM Configurator]], [[AVMConf_Kazenyuk|Weekly reports]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1289</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1289"/>
				<updated>2012-04-11T11:28:35Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Research Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Research Projects =&lt;br /&gt;
&lt;br /&gt;
* Fall 2011: Recommender Systems&lt;br /&gt;
* Spring 2012: [[НИР#Конфигуратор контейнеров AndroidVM|AndroidVM Configurator]], [[AVMConf_Kazenyuk|Weekly reports]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%9D%D0%98%D0%A0&amp;diff=1288</id>
		<title>НИР</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%9D%D0%98%D0%A0&amp;diff=1288"/>
				<updated>2012-04-11T11:24:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Конфигуратор контейнеров AndroidVM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Карта дорог ==&lt;br /&gt;
Руководитель: Лесин&amp;lt;BR&amp;gt;&lt;br /&gt;
Ссылка на проект:&amp;lt;BR&amp;gt;&lt;br /&gt;
Команда:&lt;br /&gt;
* Иванов Антон&lt;br /&gt;
* Сорокин Артем&lt;br /&gt;
* Кононенко Василий&lt;br /&gt;
Отчёт:&lt;br /&gt;
* 6.03.2012 - Первая встреча.&lt;br /&gt;
** Задачи на неделю:&lt;br /&gt;
** Кононенко: подготовить результаты прошлого семестра для коллективного проекта.&lt;br /&gt;
** Сорокин, Иванов: разобраться с базовыми алгоритмами поиска кратчайших путей.&lt;br /&gt;
* 20.03.2012 - Третья встреча.&lt;br /&gt;
** Обсудили структуру проекта. Определили &amp;quot;первые шаги&amp;quot; реализации.&lt;br /&gt;
** Задачи на неделю:&lt;br /&gt;
** Кононенко: Презентация (reaches), организация проекта, загрузка OSM формата, reaches preprocessing. &lt;br /&gt;
** Сорокин: создать wiki, github, разобраться с визуализатором и написать алг. Дейкстры, презентация? &lt;br /&gt;
** Иванов: web интерфейс (client-side), работающий сервер обрабатывающий запросы поиска евклидова расстояния между 2мя точками&lt;br /&gt;
** ?- допишите на какую тему презентации плиз.&lt;br /&gt;
* 27.03.2012&lt;br /&gt;
** Была проведена презентация Артема Сорокина по алгоритмам на графах (? уточни плз. название алгоритмов)&lt;br /&gt;
** Задачи на неделю:&lt;br /&gt;
** Иванов: закончить предыдущее задание. (ServerSide договорились делать на python'e, клиент уже почти написан на javascript'e с использованием openLayers api)&lt;br /&gt;
&lt;br /&gt;
== MyFit ==&lt;br /&gt;
Руководитель: EMC&amp;lt;BR&amp;gt;&lt;br /&gt;
Ссылка на проект:&lt;br /&gt;
* [http://osll.spb.ru/projects/myfit/ трекер]&lt;br /&gt;
* [http://code.google.com/p/myfit/ репозиторий]&lt;br /&gt;
Команда:&lt;br /&gt;
* Опейкин Александр&lt;br /&gt;
* Певзнер Алина&lt;br /&gt;
* Башоров Залим&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 09.03.2012 ==== &lt;br /&gt;
Выполнено 2 тестовых задания на Java и на GWT.&amp;lt;BR&amp;gt;&lt;br /&gt;
Получены следующие задачи:&lt;br /&gt;
* [http://redmine.osll.spb.ru/issues/3155 Опейкин] (Готово)&lt;br /&gt;
* [http://redmine.osll.spb.ru/issues/3156 Певзнер] (Готово)&lt;br /&gt;
* [http://redmine.osll.spb.ru/issues/3157 Башоров] (Готово)&lt;br /&gt;
&lt;br /&gt;
==== 12.03.2012 ====&lt;br /&gt;
Получены следующие задачи:&lt;br /&gt;
* [http://redmine.osll.spb.ru/issues/3175 Башоров]&lt;br /&gt;
* [http://redmine.osll.spb.ru/issues/3177 Опейкин]&lt;br /&gt;
* [http://redmine.osll.spb.ru/issues/3176 Певзнер]&lt;br /&gt;
&lt;br /&gt;
==== 27.03.2012 ====&lt;br /&gt;
Митинг в EMC -- обсудили текущие задачи и тестовые задания. &amp;lt;br/&amp;gt;&lt;br /&gt;
Закоммитили рабочие версии кода по задачам, ожидаем ревью. &amp;lt;br/&amp;gt;&lt;br /&gt;
(задачи: [http://redmine.osll.spb.ru/issues/3175 Башоров], [http://redmine.osll.spb.ru/issues/3177 Опейкин], [http://redmine.osll.spb.ru/issues/3176 Певзнер])&lt;br /&gt;
&lt;br /&gt;
== GPU ==&lt;br /&gt;
Руководитель: Рубен Артурович Гиргидов&amp;lt;BR&amp;gt;&lt;br /&gt;
Ссылка на проект:&amp;lt;BR&amp;gt;&lt;br /&gt;
Команда:&lt;br /&gt;
* Коровин Алексей&lt;br /&gt;
* Лазарев Сергей&lt;br /&gt;
* Кормишин Сергей&lt;br /&gt;
Отчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
*1я встреча нам были выданы вводные задачи: &lt;br /&gt;
** Разобраться с CUDA, установить и настроить окружение. Написать простенький алгоритм. (Коровин А.)&lt;br /&gt;
** Вспомнить &amp;quot;всё&amp;quot; о регулярных выражениях: какие бывают, как пишутся (Лазарев С.)&lt;br /&gt;
** Найти обработчики регулярных выражений (Matcher'ы), разобраться в их строении и принципе работы. (Кормишин С.)&lt;br /&gt;
*2я встреча:&lt;br /&gt;
** Обсудили наши предыдущие задания, расписали план выполнения проекта, цели и др.&lt;br /&gt;
** Выданы следующие задачи:&lt;br /&gt;
**# Реализовать обработчик РВ на Cuda для одной и n строк (Коровин А.)&lt;br /&gt;
**# Найти обработчики РВ на CPU на C++ и адаптировать его для n строк (Кормишин С.)&lt;br /&gt;
**# Реализовать обработчик РВ нa cuBLAS (Лазарев С.)&lt;br /&gt;
*3я встреча:&lt;br /&gt;
** Обсудили наши успехи, искали нужное представление автомата в виде матрицы для задачи реализации РВ на cuBLAS&lt;br /&gt;
** Решили какие паттерны РВ будут в бенчмарках&lt;br /&gt;
** По CUDA на неделю нужно было реализовать простейшую схему распараллеливания существующих реализаций регулярных выражений(Regexp9, Cuda paper code) и посмотреть на производительность.&lt;br /&gt;
*4я встреча:&lt;br /&gt;
** Портированная библиотека работать не хочет и разобраться без отладчика - очень трудно. Попытались настроить удалённую отладку на CUDA. Всё настроилось, но софт (Nsight) очень сырой, происходят непонятные ошибки и они нигде не журналируются и не объясняются. (Коровин А.)&lt;br /&gt;
*5я встреча:&lt;br /&gt;
** Реализован поиск с помощью регулярных выражений на основе матричных вычислений с использованием библиотеки cuBLAS. Пока сделан поиск в одной строке. Дальше надо распараллелить на несколько строк. (Лазарев С.)&lt;br /&gt;
** Портированная библиотека после длительной отладки начала матчить строку с регулярным выражением. Задача 1 выражение - 1 строка решена. Следующая задача задействовать все ядра видеокарты и научиться матчить N строк на одно регулярное выражение. (Коровин А.)&lt;br /&gt;
** Реализовн поиск с помощью re2 одной строки на одном ядре. Теперь нужно сделать для n строк на к ядрах.&lt;br /&gt;
&lt;br /&gt;
== Syrop ==&lt;br /&gt;
Руководитель: Смаль Александр Владимирович&amp;lt;BR&amp;gt;&lt;br /&gt;
Ссылка на проект: [https://github.com/avsmal/Syrop Syrop]&amp;lt;BR/&amp;gt;&lt;br /&gt;
Wiki проекта: [https://github.com/avsmal/Syrop/wiki Github] &amp;lt;BR/&amp;gt;&lt;br /&gt;
Команда:&lt;br /&gt;
* Кринкин Михаил&lt;br /&gt;
* Мартынов Семён&lt;br /&gt;
* Крашенинникова Ксения&lt;br /&gt;
* Великий Алексей&lt;br /&gt;
Отчёт:&lt;br /&gt;
* 27/feb/2011 - Первая встреча. Обсуждение цели проекта, способов реализации и внутри командного взаимодействия. Разделение задач. Создан репозиторий проекта на GitHub. Открытый вопрос - применение методологий разработки в проекте.&lt;br /&gt;
* 01/mar/2011 - Сode review.&lt;br /&gt;
* 05/mar/2011 - Введение договоренностей о code style, оформлении документации, спецификация на интерфейсы. Показ первого GUI, уточнение новых задач.&lt;br /&gt;
* 12/mar/2011 - Всё хорошо.&lt;br /&gt;
* 19/mar/2011 - Снова всё хорошо - работаем.&lt;br /&gt;
* 26/mar/2011 - Семен у нас большой шутник, см. список задач на трекере&lt;br /&gt;
&lt;br /&gt;
== Дублирующий код ==&lt;br /&gt;
Руководитель: Иваницкий&amp;lt;BR&amp;gt;&lt;br /&gt;
Ссылка на проект: http://code.google.com/p/aptu-practice-code-duplication/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Команда:&lt;br /&gt;
* Бандурин Дима (Project manager)&lt;br /&gt;
* Лепенькин Ярослав (Поиск дублирующего кода в C++)&lt;br /&gt;
* Фофанова Маша (Поиск дублирующего кода в Java)&lt;br /&gt;
&lt;br /&gt;
Отчёт:&lt;br /&gt;
&lt;br /&gt;
===28.02.2012 - Вводная встреча===&lt;br /&gt;
* Распределение ролей в команде&lt;br /&gt;
:Бандурин Дима (Project manager)&lt;br /&gt;
:Лепенькин Ярослав. Изучение специфики C++ для поиска дублирующего кода&lt;br /&gt;
:Фофанова Маша. Изучение специфики Java для поиск дублирующего кода.&lt;br /&gt;
* Уточнение функционала&lt;br /&gt;
* Организационные вопросы&lt;br /&gt;
&lt;br /&gt;
===06.03.2012 - Контрольная встреча===&lt;br /&gt;
* Изучение существующих решений &lt;br /&gt;
** Michael Wise's Greedy String Tiling algorithm&lt;br /&gt;
** Преобразование Барроуза-Уиллера&lt;br /&gt;
** Алгоритм Рабина-Карпа&lt;br /&gt;
** Механизм использующийся в IntelliJ IDEA&lt;br /&gt;
[[Файл:Solutions.pdf|краткое описание]]&lt;br /&gt;
&lt;br /&gt;
===15.03.2012===&lt;br /&gt;
В рамках НИР необходимо ответить на три вопроса.&lt;br /&gt;
* Научная новизна&lt;br /&gt;
** Список существующих решений для нашей задачи.(Ярослав)&lt;br /&gt;
** Способы оценки существующих решений.(Маша) &lt;br /&gt;
** Библиотеки, для проведения испытания (исследуемая выборка) (Дмитрий)&lt;br /&gt;
* Рабочий прототип. Решено делать плагин на базе IntelliJ IDEA. Функциональность плагина будет выяснена дальше. &lt;br /&gt;
* Этапы разработки&lt;br /&gt;
Решено разбить разработку на три этапа.&lt;br /&gt;
# Определение требований к разрабатываемой программе.(3 недели)&lt;br /&gt;
# Создание прототипа (2 недели)&lt;br /&gt;
# Разработка плагина (4 недели)&lt;br /&gt;
## Основная функциональность (2 недели)&lt;br /&gt;
## Тестирование и доведение (2 неделя)&lt;br /&gt;
## Документирование и создание презентационных материалов (1 неделя параллельно со вторым пунктом.)&lt;br /&gt;
Итого 9 недель. Предположительный срок завершения проекта : 21 мая&lt;br /&gt;
&lt;br /&gt;
===21.03.2012===&lt;br /&gt;
*Возможные метрики для сравнения алгоритмов поиска дубликатов&lt;br /&gt;
** Время работы, используемая память, CPU&lt;br /&gt;
** Число правильно найденных дубликатов&lt;br /&gt;
*** Необходимо учитывать длину каждого дубликата, чтобы учитывать возможную вложенность. Длина дубликата определяется числом символов в нем.&lt;br /&gt;
** Число неправильно найденных дубликатов&lt;br /&gt;
*Метрики для алгоритмов замены дубликатов&lt;br /&gt;
** Объем кода, получающегося после замены найденных дубликатов на вызовы соответствующих методов&lt;br /&gt;
** Релевантность участка кода. Код считается иррелевантным, если его замена на предлагающийся код слишком трудоемка и не имеет смысла.&lt;br /&gt;
*Стоит также определить, на каких констукциях дубликатов алгоритмы работают лучше, а на каких хуже.&lt;br /&gt;
&lt;br /&gt;
== Конфигуратор контейнеров AndroidVM ==&lt;br /&gt;
Руководитель: Кринкин К.В.&lt;br /&gt;
&lt;br /&gt;
Команда:&lt;br /&gt;
* Владислав Савельев&lt;br /&gt;
* Дмитрий Шеставин&lt;br /&gt;
* Сергей Казенюк ([[AVMConf_Kazenyuk|отчёты]])&lt;br /&gt;
&lt;br /&gt;
Отчёт:&lt;br /&gt;
&lt;br /&gt;
13 марта. Встреча с разработчиками проекта. Поставлены задачи.&lt;br /&gt;
: Владислав: Послушал лекцию Кирилла Владимировича про QT. Подумал об интерфейсе конфигуратора. Написал очень черновой вариант, создающий и запускающий контейнеры. Начал смотреть видео лекций Кирилла Владимировича про QT и шаблон MVC, а также читать про QML.&lt;br /&gt;
&lt;br /&gt;
27 марта.&lt;br /&gt;
: Владислав: Написал интерфейс с лейаутами, правильно создающий контейнеры. Для создания добавил диалоговое окно (с валидацией адреса и прочих штук).&lt;br /&gt;
&lt;br /&gt;
10 апреля.&lt;br /&gt;
: Владислав: Переписал интерфейс с использованием «модели — представления — модели представления». Нарисовал иконок и спроектировал внешний вид приложения в перспективе для презентации Жени Баталова на предзащите.&lt;br /&gt;
: Добавил в программный интерфейс конфигуратора возможность для получения от устройства информации о списке контейнеров.&lt;br /&gt;
&lt;br /&gt;
== Поиск дублирующих сообщений об ошибках ==&lt;br /&gt;
&lt;br /&gt;
Команда:&lt;br /&gt;
* Ждан Анна&lt;br /&gt;
* Краско Евгений&lt;br /&gt;
* Кудинкин Алексей&lt;br /&gt;
&lt;br /&gt;
Отчет 03.03 - 11.03&lt;br /&gt;
* Настроено окружение: проект в MPS, проект в IDEA&lt;br /&gt;
* Описана модель данных на языке dnq&lt;br /&gt;
* Написан rest api для админки и для добавления в базу новых сообщений об ошибках&lt;br /&gt;
* Написан парсер сообщений об ошибках&lt;br /&gt;
* Написана первая версия алгоритма сравнения сообщений об ошибках&lt;br /&gt;
* Написаны базовые классы для запуска тестов (различные заглушки для методов сервлет-контейнера, создание контекста для бинов и тп)&lt;br /&gt;
* Написаны тесты на парсер и алгоритм сравнения&lt;br /&gt;
* Частично написаны тесты на rest api (jmeter)&lt;br /&gt;
&lt;br /&gt;
Отчет 11.03 - 18.03&lt;br /&gt;
* Улучшена первая версия алгоритма сравнения сообщений об ошибках&lt;br /&gt;
* Реализован альтернативный алгоритм сравнения сообщений об ошибках. &lt;br /&gt;
* Написаны тесты на оба алгоритма&lt;br /&gt;
* Реализован парсер сообщений об ошибках для языка C#. Парсер рассчитан на формат, принятый в Решарпере&lt;br /&gt;
* Написаны тесты на парсер&lt;br /&gt;
* В язык для рестовых тестов добавлена возможность проверять хереды респонса&lt;br /&gt;
* Добавлен ui для администрирования приложение&lt;br /&gt;
* Начата реализация JobProcessor'a, обрабатывающего сообщения об ошибках на предмет поиска дубликатов.&lt;br /&gt;
&lt;br /&gt;
Отчет 19.03 - 25.03&lt;br /&gt;
* Написан классификатор, разбивающий сообщения об ошибках на кластеры.&lt;br /&gt;
* Добавлены новые возможности web-интерфейса для администрирования приложения.&lt;br /&gt;
&lt;br /&gt;
Отчет 25.03 - 7.04&lt;br /&gt;
* Написан JobProcessor, разбивающий сообщения об ошибках на кластеры.&lt;br /&gt;
* Написаны тесты на JobProcessor&lt;br /&gt;
* Начата реализация интеграции приложения с Ютрэком&lt;br /&gt;
* Осуществлен переход на более новую версию библиотеки jersey&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=AVMConf_Kazenyuk&amp;diff=1287</id>
		<title>AVMConf Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=AVMConf_Kazenyuk&amp;diff=1287"/>
				<updated>2012-04-11T11:24:07Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Weekly reports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Weekly reports ==&lt;br /&gt;
; WW11 (12.03-18.03)&lt;br /&gt;
: File synchronization libraries and file system subtree snapshotting approaches research&lt;br /&gt;
&lt;br /&gt;
; WW12 (19.03-25.03)&lt;br /&gt;
: File system subtree librsync-based synchronizer preliminary implementation&lt;br /&gt;
&lt;br /&gt;
; WW13 (26.03-01.04)&lt;br /&gt;
: Skeleton file system Linux kernel module implementation&lt;br /&gt;
&lt;br /&gt;
; WW14 (02.04-08.04)&lt;br /&gt;
: Skeleton file system LKM management interface (through sysfs)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1286</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1286"/>
				<updated>2012-04-11T11:11:24Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Research Projects =&lt;br /&gt;
&lt;br /&gt;
* Fall 2011: Recommender Systems&lt;br /&gt;
* Spring 2012: [[AVMConf_Kazenyuk|AVM Container Configurator]]&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=AVMConf_Kazenyuk&amp;diff=1285</id>
		<title>AVMConf Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=AVMConf_Kazenyuk&amp;diff=1285"/>
				<updated>2012-04-11T11:09:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: Новая страница: «== Weekly reports == ; WW11 : File synchronization libraries and file system subtree snapshotting approaches research  ; WW12 : File system subtree librsync-based sy…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Weekly reports ==&lt;br /&gt;
; WW11&lt;br /&gt;
: File synchronization libraries and file system subtree snapshotting approaches research&lt;br /&gt;
&lt;br /&gt;
; WW12&lt;br /&gt;
: File system subtree librsync-based synchronizer preliminary implementation&lt;br /&gt;
&lt;br /&gt;
; WW13&lt;br /&gt;
: Skeleton file system Linux kernel module implementation&lt;br /&gt;
&lt;br /&gt;
; WW14&lt;br /&gt;
: Skeleton file system LKM management interface (through sysfs)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1284</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1284"/>
				<updated>2012-04-11T11:08:08Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Research Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Research Projects =&lt;br /&gt;
&lt;br /&gt;
[[AVMConf_Kazenyuk]]&lt;br /&gt;
&lt;br /&gt;
== AVM Container FS snapshotting ==&lt;br /&gt;
; WW11&lt;br /&gt;
: File synchronization libraries and file system subtree snapshotting approaches research&lt;br /&gt;
&lt;br /&gt;
; WW12&lt;br /&gt;
: File system subtree librsync-based synchronizer preliminary implementation&lt;br /&gt;
&lt;br /&gt;
; WW13&lt;br /&gt;
: Skeleton file system Linux kernel module implementation&lt;br /&gt;
&lt;br /&gt;
; WW14&lt;br /&gt;
: Skeleton file system LKM management interface (through sysfs)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1283</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1283"/>
				<updated>2012-04-11T11:07:51Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Research Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Research Projects =&lt;br /&gt;
&lt;br /&gt;
[AVMConf_Kazenyuk]&lt;br /&gt;
&lt;br /&gt;
== AVM Container FS snapshotting ==&lt;br /&gt;
; WW11&lt;br /&gt;
: File synchronization libraries and file system subtree snapshotting approaches research&lt;br /&gt;
&lt;br /&gt;
; WW12&lt;br /&gt;
: File system subtree librsync-based synchronizer preliminary implementation&lt;br /&gt;
&lt;br /&gt;
; WW13&lt;br /&gt;
: Skeleton file system Linux kernel module implementation&lt;br /&gt;
&lt;br /&gt;
; WW14&lt;br /&gt;
: Skeleton file system LKM management interface (through sysfs)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1282</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1282"/>
				<updated>2012-04-11T11:06:53Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* == AVM Container FS snapshotting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
= Research Projects =&lt;br /&gt;
&lt;br /&gt;
== AVM Container FS snapshotting ==&lt;br /&gt;
; WW11&lt;br /&gt;
: File synchronization libraries and file system subtree snapshotting approaches research&lt;br /&gt;
&lt;br /&gt;
; WW12&lt;br /&gt;
: File system subtree librsync-based synchronizer preliminary implementation&lt;br /&gt;
&lt;br /&gt;
; WW13&lt;br /&gt;
: Skeleton file system Linux kernel module implementation&lt;br /&gt;
&lt;br /&gt;
; WW14&lt;br /&gt;
: Skeleton file system LKM management interface (through sysfs)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1281</id>
		<title>Участник:Sergey.Kazenyuk</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sergey.Kazenyuk&amp;diff=1281"/>
				<updated>2012-04-11T11:05:53Z</updated>
		
		<summary type="html">&lt;p&gt;Sergey.kazenyuk: /* Сергей Казенюк */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Сергей Казенюк =&lt;br /&gt;
[mailto:sergey.kazenyuk@spbau.se sergey.kazenyuk@spbau.se]&lt;br /&gt;
&lt;br /&gt;
=== AVM Container FS snapshotting =&lt;br /&gt;
&lt;br /&gt;
; WW11&lt;br /&gt;
: File synchronization libraries and file system subtree snapshotting approaches research&lt;br /&gt;
&lt;br /&gt;
; WW12&lt;br /&gt;
: File system subtree librsync-based synchronizer preliminary implementation&lt;br /&gt;
&lt;br /&gt;
; WW13&lt;br /&gt;
: Skeleton file system Linux kernel module implementation&lt;br /&gt;
&lt;br /&gt;
; WW14&lt;br /&gt;
: Skeleton file system LKM management interface (through sysfs)&lt;/div&gt;</summary>
		<author><name>Sergey.kazenyuk</name></author>	</entry>

	</feed>