- •Методические указания
- •Указания по технике безопасности при выполнении лабораторных работ
- •Практическая работа № 1
- •Перечисляемые типы
- •Лабораторная работа № 2
- •1. Общие указания по работе
- •2. Методические указания по их выполнению
- •Теоретическое введение Массивы
- •Практическая работа № 3 классы
- •1. Общие указания по работе
- •2. Методические указания по их выполнению
- •Теоретическое введение
- •Практическая работа № 4 перегрузка операторов
- •1. Общие указания по работе
- •2. Методические указания по их выполнению
- •Теоретическое введение
- •Практическая работа № 5
- •1. Общие указания по работе
- •Практическая работа № 6 структуры данных
- •1. Общие указания по работе
- •2. Методические указания по их выполнению
- •Теоретическое введение
- •Практическая работа № 7
- •1. Общие указания по работе
- •2. Методические указания по их выполнению
- •Теоретическое введение
- •Практическая работа № 8
- •1. Общие указания по работе
- •Практическая работа № 9 обработка исключений
- •1. Общие указания по работе
- •2. Методические указания по их выполнению
- •Теоретическое введение
- •Библиографический список
- •Содержание
- •394026 Воронеж, Московский просп., 14
Практическая работа № 8
ВЕКТОРЫ
1. Общие указания по работе
Цель работы: Приобрести навыки работы с векторами в среде C++.
2. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ИХ ВЫПОЛНЕНИЮ
2.1. Изучить теоретический материал по теме лабораторной работы.
Теоретическое введение
Вектора
Встроенное в С++ понятие вектора было разработано так, чтобы обеспечить максимальную эффективность выполнения при минимальном расходе памяти. Оно также (особенно когда используется совместно с указателями) является весьма универсальным инструментом для построения средств более высокого уровня. Можно возразить, что размер вектора должен задаваться как константа, что нет проверки выхода за границы вектора и т.д. Ответ на подобные возражения таков: «Вы можете запрограммировать это сами.». Проверим средства абстракции языка С++, попытавшись реализовать эти возможности для векторных типов, которые мы создадим сами, и посмотрим, какие с этим связаны трудности, каких это требует затрат, и насколько получившиеся векторные типы удобны в обращении.
class vector (* int* v; int sz; public: vector(int); // конструктор ~vector(); // деструктор
int size() (* return sz; *)
void set_size(int); int amp; operator[](int);
int amp; elem(int i) (* return v[i]; *) *);
Функция size возвращает число элементов вектора, таким образом индексы должны лежать в диапазоне 0 ... size()-1. Функция set_size сделана для изменения этого размера, elem обеспечивает доступ к элементам без проверки индекса, а operator[] дает доступ с проверкой границ. Идея состоит в том, чтобы класс сам был структурой фиксированного размера, управляющей доступом к фактической памяти вектора, которая выделяется конструктором вектора с помощью распределителя свободной памяти new:
vector::vector(int s) (* if (s«=0) error(„bad vector size“); // плохой размер вектора sz = s; v = new int[s]; *)
Теперь можно описывать вектора типа vector почти столь же элегантно, как и вектора, встроенные в сам язык:
vector v1(100); vector v2(nelem*2-4);
Операцию доступа можно определить как:
int amp; vector::operator[](int i) (* if(i«0 !! sz„=i) error(«vector index out of range“); // индекс выходит за границы вектора return v[i]; *)
Операция !! (ИЛИИЛИ) – это логическая операция ИЛИ. Ее правый операнд вычисляется только тогда, когда это необходимо, то есть если вычисление левого операнда дало ноль. Возращение ссылки обеспечивает то, что запись [] может использоваться с любой стороны операции присваивания:
v1[x] = v2[y];
Функция с именем ~vector – это деструктор, то есть функция, описанная для того, чтобы она неявно вызывалась, когда объект класса выходит из области видимости. Деструктор класса C имеет имя ~C. Если его определить как:
vector::~vector() (* delete v; *)
то он будет, с помощью операции delete, освобождать пространство, выделенное конструктором, поэтому когда vector выходит из области видимости, все его пространство возвращается обратно в память для дальнейшего использования.
Выполнить практические задания:
1. Реализовать программу заполняющая вектор структур описывающих людей (структура содержит информацию об имени и возрасте). С помощью алгоритма for_each вывести информацию обо всех людях. С помощью алгоритма find_if найти всех людей, чей возраст превышает определенное значение. С помощью алгоритма for_each вывести информацию о найденных людях.
2. Реализовать программу выполняющую сортировку с помощью алгоритма sort вектора, содержащего массив объектов класса «автомобиль», который задается названием и мощностью двигателя. Сортировку производить по мощности двигателя (по возрастающей).
3. Реализовать программу заполняющую вектор из 10 элементов числами Фибоначчи. Для заполнения разработать функциональный объект и использовать алгоритмы заполнения и порождения STL.