Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Кафедра АСУ
/
Звіт
до розрахункової роботи
з предмету
«Об’єктно-орієнтоване програмування»
на тему «Стандартна бібліотека шаблонів STL»
Мета роботи:
Ознайомитись зі структурою та функціональним призначенням класів C++ зі стандартної бібліотеки шаблонів STL (Standard Template Library), дослідити переваги їх використання у прикладних програмах.
Послідовність роботи:
1. Ознайомитись з теоретичним матеріалом про стандартну бібліотеку шаблонів STL.
2. Для заданого варіанту завдання написати програму з використанням контейнерів, алгоритмів та ітераторів STL.
3. Визначити часові характеристики роботи програми (сумарний час на виконання кожного різновиду операції на прикладі з великою кількістю згенерованих випадковим чином об’єктів або операцій над ними (наприклад, 1000)).
4. Доповнити програму з ЛР № 5 аналогічними можливостями визначення часових характеристик роботи і обчислити їх значення на такому ж прикладі.
5. Зробити висновок про ефективність застосування контейнерів, алгоритмів та ітераторів STL.
Індивідуальне завдання:
27. На основі контейнера vector побудувати одновимірний динамічний масив цілих чисел. Виконати операції введення елементів у масив, конкатенація двох масивів, злиття двох впорядкованих масивів зі збереженням впорядкованості, виведення масиву на екран.
Тексти програм:
Без використання контейнера:
#include <iostream>
#include <windows.h>
#include <string.h>
#include <time.h>
using namespace std;
template <class T>
class mas
{
public:
T *m;
int size;
mas(int newsize);
~mas();
void konkat(mas& A);
void zlytya(mas& A);
void sort();
friend ostream& operator>> <>(ostream&, mas&);
friend istream& operator<< <>(istream&, mas&);
};
template <class T>
mas<T>::mas(int newsize)
{
m = new T[size = newsize];
for(int i=0; i<size; i++)
m[i]=rand()/100.0;
}
template <class T>
mas<T>::~mas()
{
delete [] m;
}
template <class T>
void mas<T>::konkat(mas& A)
{
int hsize=size+A.size;
T *k = new T[hsize];
int i=0;
for(; i<size; i++)
k[i] = m[i];
for(int j=0; j<A.size; i++, j++)
k[i] = A.m[j];
delete [] m;
size=hsize;
m = k;
}
template <class T>
void mas<T>::zlytya(mas& A)
{
sort();
A.sort();
int hsize=size+A.size;
T *k = new T[hsize];
int i=0, v1=0, v2=0;
while(i<hsize) {
if(v1==size || v2==A.size) break;
if(m[v1]<A.m[v2]) {
k[i]=m[v1];
i++;
v1++;
} else {
k[i]=A.m[v2];
i++;
v2++;
}
}
if(v1!=size)
while(i<hsize) {
k[i]=m[v1];
i++;
v1++; }
else if(v2!=A.size)
while(i<hsize) {
k[i]=A.m[v2];
i++;
v2++; }
delete [] m;
m=k;
size=hsize;
}
template <class T>
void mas<T>::sort()
{
for(int i=0; i<size-1; i++)
for(int j=i+1; j<size; j++)
if(m[i]>m[j])
{
T buf=m[i];
m[i]=m[j];
m[j]=buf;
}
}
template <class T>
istream& operator>>(istream& is, mas<T>& x)
{
cout<<"Введіть "<<x.size<<" елементів:\n";
for(int i=0; i<x.size; i++)
is>>x.m[i];
return is;
}
template <class T>
ostream& operator<<(ostream& os, mas<T>& x)
{
os<<"Вивід: ";
for(int i=0; i<x.size; i++)
os<<x.m[i]<<' ';
os<<endl;
return os;
}
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
clock_t time;
time = clock();
double vv;
int N=10000;
mas<int> V(N), F(N);
V.konkat(F);
V.zlytya(F);
cout<<V;
time = clock() - time;
vv=(double)time/CLOCKS_PER_SEC;
cout<<"Час: "<<vv<<"c."<<endl;
getchar();
getchar();
}
З використанням контейнера vector:
#include <windows.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
clock_t time;
time = clock();
double vv;
vector <int> v, w;
vector <int>::iterator p, q;
int x;
int N=10000;
for(int i=0; i<N; i++) {
x=rand()/100.0;
v.push_back(x); }
for(int i=0; i<N; i++) {
x=rand()/100.0;
w.push_back(x); }
for(p=w.begin() ; p!= w.end(); p++)
v.push_back(*p);
sort(v.begin(),v.end());
sort(w.begin(),w.end());
vector <int> res(N*3);
merge(v.begin(),v.end(),w.begin(),w.end(),res.begin());
cout<<"Вивід: ";
for(p=res.begin() ; p!= res.end(); p++)
cout<<" "<<*p;
cout<<endl;
time = clock() - time;
vv=(double)time/CLOCKS_PER_SEC;
cout<<"Час: "<<vv<<"c."<<endl;
getchar();
getchar();
}
Контрольні приклади виконання:
N=1000
Без використання контейнера:
З виведенням
/
Без виведення
/
З використанням контейнера vector:
З виведенням
/
Без виведення
/
N=10 000
Без використання контейнера:
Без виведення
/
З використанням контейнера vector:
Без виведення
/
N=100 000
Без використання контейнера:
Без виведення
Дуже велике число = 100 секунд .
З використанням контейнера vector:
Без виведення
/
Отже, виконуючи дану розрахункову роботу я ознайомивсь зі структурою та функціональним призначенням класів C++ зі стандартної бібліотеки шаблонів STL (Standard Template Library), дослідив переваги їх використання у прикладних програмах. Для порівняння швидкості двох програм, без використання контейнерів і з використанням контейнеру vector, рандомно генерувались 1000, 10 000 та 100 000 чисел. Далі над ними виконувались такі дії як конкатенація та злиття. В результаті досліджень при кількості чисел N=1000 програма створена без контейнерів видала швидкий результат 0.048 с., недалекий від програми з використанням контейнера 0.032с. Коли ж кількість елементів збільшили в десятеро, швидкість програми буз використання контейнерів впала в 7 разів (N=10 000) відносно другого варіанту програми (2.043с. і 0.265с. відповідно). При збільшені кількості чисел ще 10 разів (N=100 000) швидкість першої програми знизилась в 80 разів в порівнянні з програмою яка використовує контейнер (100с. і 1.872с. відповідно). Причина меншої швидкості програми без використання контейнера є менш досконалий алгоритм сортування елементів.