- •1.1.1 Пример программы, выводящей текст на экран (пример 1)
- •1.1.2 Директивы препроцессору (подключение заголовочных файлов)
- •1.1.3 Комментарии
- •1.1.4 Функции
- •1.1.5 Ввод и вывод на экран
- •1.2. Переменные и их объявление
- •1.2.1 Пример программы cложения целых чисел (пример 2)
- •1.2.2 Переменные и их объявление
- •1.3. Арифметические операторы
- •1.3.1 Примеры арифметических операций (пример 3)
- •1.3.2 Группировка подвыражений с помощью скобок
- •1.4. Логические выражения и оператор if
- •1.4.1 Условные конструкции. Пример условных конструкций (пример 4)
- •1.4.2 Логические выражения. Логические операции и, или, не (пример 5)
- •1.4.3 Типичные ошибки
- •1.4.4 Вложенные условия
- •1.5. Арифметический логический оператор (пример 6)
- •1.6. Селективные конструкции
- •1.6.1 Селективные конструкции. Пример определения оценки в зависимости от количества баллов (пример 6)
- •1.6.2 Оператор Switch. Пример меню с выбором действия (пример 7)
- •1.7. Циклы while и do…while
- •1.7.1 Цикл с предусловием while. Пример возведения в степень в цикле (пример 8)
- •1.7.2 Цикл с постусловием do...While
- •1.8. Пошаговый цикл for
- •1.8.1 Пример работы оператора for - вычисление суммы чисел (пример 9)
- •1.8.2 Пошаговый цикл for
- •1.8.3 Операторы break и continue
- •1.8.4 Пример вычисление факториала (пример 10)
- •1.9. Функции
- •1.9.1 Использование функций библиотеки stl (пример 11)
- •1.9.2 Определение новых функций
- •1.9.3 Пример функции (пример 12)
- •1.10. Размещение программ и данных в памяти
- •1.11. Ссылки и указатели
- •1.11.1. Ссылки
- •1.11.2. Указатели
- •1.11.3. Передача параметров в функцию по ссылке и указателю
- •2.2 Организация ввода/вывода
- •2.3 Строковые переменные и константы
- •2.4 Математические функции
- •3.1. Массивы
- •3.1.1. Одномерный массив
- •3.1.2. Динамическое размещение одномерного массива
- •3.1.3. Передача массива в функцию (пример 3.1)
- •3.1.4. Двумерный массив
- •3.1.5. Динамическое размещение двумерного массива (пример 3.2)
- •3.2 Контейнеры
- •3.3. Вектор vector (пример 3.3)
- •4.4. Список list
- •3.4.1. Списки
- •3.4.2. Итераторы
- •3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)
- •3.5. Очереди и стек
- •3.5.1. Двусторонняя очередь deque (пример 3.5)
- •3.5.2. Стек stack
- •3.5.3. Очередь queue
- •3.6. Ассоциативные контейнеры
- •3.6.1. Контейнер map (пример 3.7)
- •3.6.2. Контейнер set (пример 3.8)
- •3.7. Алгоритмы
- •4.1 Структуры
- •4.1.1. Пример 4.1. Структура для работы с компонентами цвета
- •4.1.2. Передача абстрактных типов в функцию
- •4.1.3. Создание функций-членов для абстрактного типа данных. Пример 4.2. Структура для работы с компонентами цвета со встроенной функцией.
- •4.2. Классы
- •4.2.1. Пример 4.3. Класс Линза
- •4.2.2. Директивы препроцессору # if ! defined, # endif (проверка на повторное подключение)
- •4.2.3. Тип доступа к членам класса
- •4.2.4. Принципы объектно-ориентированного проектирования
- •4.2.5. Типы функций-членов класса
- •4.3 Конструкторы и деструкторы класса
- •4.3.1. Конструкторы
- •4.3.2. Деструктор (пример 4.4. Конструктор и деструктор класса Матрица)
- •4.3.3. Проверка правильности параметров. Исключительные ситуации
- •4.4. Модификаторы, селекторы и другие члены классов
- •4.4.1. Модификаторы и селекторы
- •4.4.2. Ключевые слова const и inline
- •4.4.3. Функции-утилиты
- •4.4.4. Сохраняемость
- •5.1. Типы наследования. Видимость членов классов
- •5.1.1. Наследование
- •5.1.2. Пример 5.1. Линза и зеркало как оптические детали
- •5.1.3. Последовательность вызова конструкторов
- •5.1.4. Типы наследования. Видимость членов классов
- •5.1.5. Множественное наследование
- •5.2. Виртуальные функции. Абстрактные классы
- •5.2.1. Виртуальные функции
- •5.2.2. Абстрактные классы
- •6. Полиморфизм
- •6.1. Перегрузка функций
- •6.1.1. Перегрузка функций
- •6.1.2. Преобразование типов
- •6.1.3. Параметры функций по умолчанию
- •6.2. Перегрузка операторов
- •6.2.1. Пример 6.1 (класс Complex (комплексное число))
- •6.2.6. Перегрузка операторов с присваиванием
- •6.2.7. Перегрузка преобразования типов
- •6.2.8. Перегрузка оператора доступа по индексу
- •6.2.9. Перегрузка операторов ввода/вывода
- •6.2.10. Неперегружаемые операторы
- •6.3. Шаблоны функций и классов
- •6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
- •6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
- •6.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
- •6.4. Объекты-функции. Предикаты
- •6.4.1. Объекты-функции. Пример 6.5 (использование объектов-функций)
- •6.4.2. Предикаты. Пример 6.6 (использование предикатов)
3.6.2. Контейнер set (пример 3.8)
Контейнер set хранит только массив уникальных ключей без значений. Этот контейнер используется, если нужно из большого количества повторяющихся данных получить массив уникальных значений.
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 3.8. Пример работы с контейнером set
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <iostream> // подключение библиотеки ввода-вывода
#include <set> // подключение описания set
#include <string> // подключение описание строк
using namespace std; // подключение стандартного пространства имен для использования библиотек
/////////////////////////////////////////////////////////////////////////////
void main()
{
set<string> glass_name; // объявление контейнера
set<string>::iterator it; // объявление итератора
// добавление в контейнер новых значений
glass_name.insert("air");
glass_name.insert("K8");
glass_name.insert("TK14");
glass_name.insert("air");
glass_name.insert("F12");
glass_name.insert("air");
glass_name.insert("TK14");
glass_name.insert("K8");
glass_name.insert("air");
// вывод всех элементов контейнера
for(it=glass_name.begin(); it!=glass_name.end(); it++)
{
cout<<*it<<endl;
}
}
///////////////////////////////////////////////////////////////////////////////
В результате выполнения программы на экран будет выведено:
F12
K8
TK14
air
3.7. Алгоритмы
Алгоритмы – это обобщенные процедуры для обработки элементов любых контейнеров. Описание большинства алгоритмов находится в файле<algorithm>.
Например, вычисление суммы всех элементов контейнера можно выполнить при помощи стандартного алгоритма:
list<double> x;
// вычисление суммы через итераторы
list<double>::iterator it;
for(it=x.begin(); it!=x.end(); it++)
{
sum+=(*it);
}
// вычисление суммы через алгоритмы
sum=accumulate(x.begin(), x.end(), 0.0);
Обобщенные процедуры для обработки элементов любых контейнеров объявлены в файле <algorithm>. Можно выделить несколько групп алгоритмов в зависимости от того, модифицируют они контейнер или только лишь извлекают необходимую информацию:
Алгоритмы не модифицирующие контейнер
Алгоритмы не модифицирующие контейнер - это процедуры поиска и сравнения.
list<string> ls;
list<string>::const_iterator it;
// поиск значения "К8" в диапазоне от ls.begin() до ls.end()
it=find(ls.begin(), ls.end(), "К8");
Алгоритмы модифицирующие значение элементов контейнера
Алгоритмы модифицирующие значение элементов контейнера, но не изменяющие порядок их следования - выполнение действий над каждым элементом контейнера, поиск и замена.
vector<int> v(100);
// заполнение всех элементов от ls.begin() до ls.end() значением 0
fill(v.begin(), v.end(), 0);
// замена всех элементов от ls.begin() до ls.end(), равных -1 на 1
replace(v.begin(), v.end(), -1, 1);
Алгоритмы модифицирующие контейнер
Алгоритмы модифицирующие контейнер, то есть изменяющие порядок следования элементов - это функции копирования, всевозможных перестановок, удаления, тасования и сортировки, двоичного поиска (в процессе поиска последовательность сортируется), разбиения и слияния последовательностей.
vector<int> v(100);
// сортировка массива
sort(v.begin(), v.end());
// перестановка элементов массива в обратном порядке
reverse(v.begin(), v.end());
Функции-помощники (перестановки и сравнения)
vector<int> v(100);
vector<int>::iterator it=v.begin();
it++;
swap(*v.begin(), *it);
Численные алгоритмы
Численные алгоритмы объявлены в файле <numeric>:
accumulate - накапливает результаты выполнения операций над последовательностью (сложение элементов)
inner_product - накапливает результаты выполнения операций над двумя последовательностями (перемножение)
partial_sum - позволяет получить последовательность инкрементных изменений (a, a+b, a+b+c, a+b+c+d, ...)
adjacent_difference - позволяет получить последовательность инкрементных изменений (a, b-a, c-b-a, d-c-b-a, ...)
Пример работы с алгоритмами
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 3.9. Пример работы с алгоритмами библиотеки STL
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <iostream> // подключение библиотеки ввода-вывода
#include <vector> // подключение описания вектора
#include <iterator> // подключение описания итераторов, нужно для использования ostream_iterator
#include <algorithm> // подключение описания алгоритмов
#include <numeric> // подключение описания численных алгоритмов (accumulate,
using namespace std; // подключение стандартного пространства имен для использования библиотек
/////////////////////////////////////////////////////////////////////////////
void main()
{
vector<int> v(10); // создание вектора из 10 элементов
vector<int>::iterator it; // объявление итератора
// пример работы алгоритма заполнения fill и вывод на экран
// заполнение элементов вектора от begin() до end() числом 0
fill(v.begin(), v.end(), 0);
cout<<endl<<endl<<"fill ----------------------"<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
// изменение значений вектора и вывод результата на экран
for(int i=0; i<v.size(); i++)
{
v[i]=i;
}
cout<<endl<<endl<<"cycle ---------------------"<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
// вычисление суммы через алгоритм accumulate
// просуммировать все элементы в диапазоне от begin() до end(), начальное значение 0
int sum=accumulate(v.begin(), v.end(), 0);
cout<<endl<<endl<<"sum -----------------------"<<endl;
cout<<sum;
// поиск
// возвращает итератор на первое число в диапазоне от begin() до end(), равное 4
it=find(v.begin(), v.end(), 4);
cout<<endl<<endl<<"find ----------------------"<<endl;
cout<<*it; // вывод значения элемента по итератору
// замена
// заменить в диапазоне от begin() до end() все числа равные 1 на -1
replace(v.begin(), v.end(), 1, -1);
// заменить в диапазоне от begin() до end() все числа равные 5 на -5
replace(v.begin(), v.end(), 5, -5);
cout<<endl<<endl<<"replace -------------------"<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
// сортировка по возрастанию
sort(v.begin(), v.end());
cout<<endl<<endl<<"sort ----------------------"<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
// создание обратной последовательности
reverse(v.begin(), v.end());
cout<<endl<<endl<<"reverse -------------------"<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
// перестановка двух элементов
it=v.begin(); // итератор на 0-й элемент
it++; // итератор на 1-й элемент
swap(*v.begin(), *it); // меняем местами элементы v.begin() и it
cout<<endl<<endl<<"swap ----------------------"<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout<<endl;
}
/////////////////////////////////////////////////////////////////////////////
