
ОП4-1
.docxГУАП\
КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Старший преподаватель |
|
|
|
Д.В. Куртяник |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 4 |
ШАБЛОНЫ. КОНТЕЙНЕРЫ STL. |
по курсу: ОСНОВЫ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель лабораторной работы: изучение видов контейнеров библиотеки STL, способов их применения и особенностей работы; изучение способов использования шаблонов функций; получение навыков программирования на языке C++.
Задание на программирование: разработать программу и провести анализ быстродействия различных контейнеров.
Номер вариант и индивидуальное задание:
23. Подсчитать количество элементов коллекции, которые совпадают с последним элементом.
Описание модели решения:
Задание выполнено для четырёх контейнеров: vector, list, multiset, map. Подключены все нужные библиотеки. Контейнеры заполняются в шаблонной функции fill числами от 0 до 5. Шаблонная функция count для вектора и списка, выводит количество элементов совпадающих с последним, благодаря методу count. В шаблонной функции v_count для map создаётся вектор, благодаря методу reserve резервируем память размером с передаваемый контейнер, алгоритм transform преобразует содержимое в вектор и в этой же функции вызываем функцию count для вектора. В шаблоне функции v_count для контейнера multiset создаётся вектор который заполняется данными из контейнера multiset, и затем вызывается функция count для вектора. Для вывода содержимого контейнеров используется шаблон функция print. Для выода содержимого контейнера map используется функция print.Также создана функция random, котрая выводит случайные числа.
Для каждого контейнера выводится время выполнения его задачи , не считая вывод содержимого контейнера.
Исходный код:
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <ctime>
#include <algorithm>
using namespace std;
int random()
{
return rand() % 6;
}
template<class Type> void count(vector<Type> arr)
{
cout <<endl<< count(arr.begin(), arr.end(), arr.back()) - 1 <<" elements matching the last"<< endl;
}
template<class Type> void count(list<Type> arr)
{
cout <<endl<< count(arr.begin(), arr.end(), arr.back()) - 1 <<" elements matching the last"<< endl;
}
template<class Type> void v_count(map<int, Type> arr, int n)
{
vector<Type> v;
v.reserve(arr.size());
transform(arr.cbegin(), arr.cend(), back_inserter(v), [](auto n)
{
return n.second;
});
count(v);
}
template<class Type> void v_count(multiset<Type> mul)
{
vector<Type> v(mul.cbegin(), mul.cend());
count(v);
}
template<class Type> void fill(map<int, Type>& arr, int n)
{
int i = 0;
generate_n(inserter(arr, arr.begin()), n, [&i]()
{ ++i;
return make_pair(i, rand() % 6);
});
}
template<class Type> void fill(multiset<Type>& arr, int n)
{
generate_n(inserter(arr, arr.begin()), n, []()
{
return rand() % 6;
});
}
template<class Type> void fill(vector<Type>& arr, int n)
{
arr.resize(n);
generate(arr.begin(), arr.end(), random);
}
template<class Type> void fill(list<Type>& arr, int n)
{
arr.resize(n);
generate(arr.begin(), arr.end(), random);
}
template<class Type> void print(Type& arr)
{
for (auto x : arr)
cout << x << " ";
cout << endl;
}
void print(map<int, int>& arr)
{
for (auto x : arr)
cout << x.second << " ";
cout << endl;
}
int main()
{
srand(time(0));
CLOCKS_PER_SEC;
int n;
cout << "Enter capacity of conteiners: ";
cin >> n;
cout << endl;
clock_t start = clock();
cout << "Vector: ";
clock_t start1 = clock();
vector<int> v;
fill(v, n);
count(v);
clock_t end1 = clock();
cout << "Time: " << (end1 - start1) / 1000.0<<endl;
print(v);
cout << "List: ";
clock_t start2 = clock();
list<int> l;
fill(l, n);
count(l);
clock_t end2 = clock();
cout << "Time: " << (end2 - start2) / 1000.0 << endl;
print(l);
cout << "Multiset: ";
clock_t start3 = clock();
multiset<int> mul;
fill(mul, n);
v_count(mul);
clock_t end3 = clock();
cout << "Time: " << (end3 - start3) / 1000.0 << endl;
print(mul);
cout << "Map: ";
clock_t start4 = clock();
map<int, int> map;
fill(map, n);
v_count(map, n);
clock_t end4 = clock();
cout << "Time: " << (end4 - start4) / 1000.0 << endl;
print(map);
clock_t end = clock();
cout << "Time: " << (end - start) /1000.0;
}
Результат работы программы:
Демонстрация корректной работы инидивидуального задания:
Проверка быстродействия и замеры времени:
Замер времени проводился на коллекциях с количеством элементов 100000. В среднем, время удаления всех вхождений элементов с заданным значением Е из коллекции L меньше всего у vector, а больше всего у multiset.
( для замера, функция print была закомментирована)
Вывод: мы изучили виды контейнеров стандартной библиотеки шаблонов, способы их применения и особенностей работы; изучили способы использования шаблонов функций; получили навыки программирования на языке С++.