Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 40030.doc
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
178.18 Кб
Скачать

Практическая работа № 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. Выполнить практические задания:

1. Реализовать программу заполняющая вектор структур описывающих людей (структура содержит информацию об имени и возрасте). С помощью алгоритма for_each вывести информацию обо всех людях. С помощью алгоритма find_if найти всех людей, чей возраст превышает определенное значение. С помощью алгоритма for_each вывести информацию о найденных людях.

2. Реализовать программу выполняющую сортировку с помощью алгоритма sort вектора, содержащего массив объектов класса «автомобиль», который задается названием и мощностью двигателя. Сортировку производить по мощности двигателя (по возрастающей).

3. Реализовать программу заполняющую вектор из 10 элементов числами Фибоначчи. Для заполнения разработать функциональный объект и использовать алгоритмы заполнения и порождения STL.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]