
- •Содержание
- •Лабораторная работа №3
- •Лабораторная работа №6
- •1. Постановка задачи:
- •Лабораторная работа №11
- •1. Постановка задачи.
- •Задача 1.
- •Задача 2.
- •5. Описание класса
- •Int getrub() {return rub;} //получение количества рублей
- •Int getkop() {return kop;} //получение количества копеек
- •Задача 3.
- •Задача 4.
- •Задача 5.
- •Лабораторная работа №13
- •1. Постановка задачи. Задача 1.
- •Задача 2.
- •Задача 3.
- •2. Описание класса
- •Int getrub() {return rub;} //получение количества рублей
- •Int getkop() {return kop;} //получение количества копеек
- •Задача 1.
- •Задача 2.
- •Задача 3.
Задача 5.
17. Описание параметризованного класса.
class My_Set
{
int len; //длина контейнера
stack<T> c_stack; //контейнер элементов множества
public:
My_Set(); //Конструктор - пустое множество
My_Set(int n); //Конструктор с параметром типа int
~My_Set(); //деструктор
void prn(); //печать элементов контейнера
T min_el(); //величина минимального элемента
T max_el(); //величина максимального элемента
T Avg(); //среднее арифметическое элементов контейнера
void Del_m(T a); //удаление элементов,равных a
void ins(T a); //вставка элемента a
void add(T a); //увеличение всех элементов контейнера на величину a
};
18. Реализация функций параметризованного класса.
template <class T>
My_Set<T>::My_Set() {len=0;}
template <class T>
My_Set<T>::My_Set(int s)
{
set<T> temp;
T a;
for(int i=0;i<s;i++)
{
cin>>a;
temp.insert(a);
}
set<T>::reverse_iterator it1=temp.rbegin();
len=0;
for (;it1!=temp.rend();it1++)
{
len++;
c_stack.push(*it1);
}
}
template <class T>
My_Set<T>::~My_Set() //деструктор
{
while (!(c_stack.empty()))
{
c_stack.pop();
}
}
template <class T>
void My_Set<T>::prn()
{
stack<T> copy=c_stack;
while (!(copy.empty()))
{
cout<<copy.top()<<" ";
copy.pop();
}
cout<<endl;
}
template <class T>
T My_Set<T>::min_el()
//поиск минимального элемента
{
T min=c_stack.top();
stack<T> copy=c_stack;
while (!(copy.empty()))
{
if (copy.top()<min)
min=copy.top();
copy.pop();
}
cout<<endl;
return min;
}
template <class T>
T My_Set<T>::max_el()
//поиск максимального элемента
{
T max=c_stack.top();
stack<T> copy=c_stack;
while (!(copy.empty()))
{
if (copy.top()>max)
max=copy.top();
copy.pop();
}
cout<<endl;
return max;
}
template <class T>
T My_Set<T>::Avg()
//нахождение среднего арифметического
{
Money a;
stack<T> copy=c_stack;
while (!(copy.empty()))
{
a+=copy.top();
copy.pop();
}
a/=len;
return a;
}
template <class T>
void My_Set<T>::Del_m(T a)
//удаление элементов, равных a из контейнера
{
set<Money> temp;
set<Money>::reverse_iterator it1;
while (!c_stack.empty())
{
if (!(c_stack.top()==a))
temp.insert(c_stack.top());
else len--;
c_stack.pop();
}
for(it1=temp.rbegin();it1!=temp.rend();it1++)
c_stack.push(*it1);
}
template <class T>
void My_Set<T>::ins(T a)
//добавление элемента a
{
set<Money> temp;
set<Money>::reverse_iterator it1;
while (!c_stack.empty())
{
temp.insert(c_stack.top());
c_stack.pop();
}
len=temp.size();
for(it1=temp.rbegin();it1!=temp.rend();it1++)
c_stack.push(*it1);
}
template <class T>
void My_Set<T>::add(T a)
{
vector<Money> temp;
vector<Money>::reverse_iterator it1;
while (!c_stack.empty())
{
temp.push_back(c_stack.top()+a);
c_stack.pop();
}
for(it1=temp.rbegin();it1!=temp.rend();it1++)
c_stack.push(*it1);
}
19. Функция main()
void main()
{
char ch;
try
{
int n;
cout<<"Input the size of the set"<<endl;
cin>>n;
My_Set<Money> set1(n);
set1.prn();
cout<<"After inserting max element"<<endl;
set1.ins(set1.max_el());
set1.prn();
cout<<"After deleting min element"<<endl;
set1.Del_m(set1.min_el());
set1.prn();
cout<<"With average added"<<endl;
set1.add(set1.Avg());
set1.prn();
}
catch(int)
{
cout<<"Error";
}
cin>>ch;
}
20. Результаты работы программы:
Input the size of the set
6
input rubli
12
input kopejki
30
input rubli
54
input kopejki
96
input rubli
45
input kopejki
31
input rubli
12
input kopejki
64
input rubli
3
input kopejki
12
input rubli
28
input kopejki
37
3,12 12,30 12,64 28,37 45,31 54,96
After inserting max element
3,12 12,30 12,64 28,37 45,31 54,96
After deleting min element
12,30 12,64 28,37 45,31 54,96
With average added
43,01 43,35 59,08 76,02 85,67
21.
Библиотека STL состоит из набора контейнерных классов и набора обобщённых алгоритмов.
Контейнеры, существующие в STL: вектор: список, двунаправленная очередь (основные последовательные), стек, очередь, очередь с приоритетами (последовательные адаптеры), словари, множества, словари с дубликатами, множества с дубликатами (ассоциативные).
Для использования контейнера STL необходимо подключить заголовочный файл, содержащий описание данного контейнера.
Итератор – это объект (класс), используемый для доступа к элементам контейнера.
Основные операции с итераторами:
разыменование;
присваивание одного итератора другому;
сравнение итераторов на равенство и неравенство;
сдвиг на соседний элемент с помощью операции инкремента(декремента).
Цикл для перебора контейнера с использованием итератора.
container cont1;
container::iterator it1;
it1=cont1.begin();
while (it1!=cont1.end())
{
…
it1++;
}
Типы итераторов в STL: входные, выходные, прямые, двунаправленные, итераторы произвольного доступа.
Функции-члены, общие для всех контейнеров:
операторы равенства (==)и неравенства (!=);
оператор присваивания (=);
удаление всех элементов (clear);
добавление элемента или диапазона элементов на заданную позицию (insert);
удаление элемента или диапазона элементов (erase);
число элементов в контейнере (size);
максимально допустимый размер контейнера (max_size);
проверка на пустоту контейнера (empty);
итератор на начало контейнера (begin);
итератор на конец контейнера (end);
реверсивный итератор на конец контейнера;
реверсивный итератор на начало контейнера.
Для контейнера vector эффективными являются операции доступа к произвольному элементу, добавление элемента в конец, удаление элемента с конца, т. к. ячейки памяти, выделенные под элементы будут иметь подряд идущие адреса.
Для контейнера list эффективными будут операции вставки и удаления в произвольной позиции, т. к. для этого нужно только поменять значения 4-х указателей, не перемещая элементы контейнера в памяти.
Для контейнера deque эффективными будут те же операции, что и для контейнера vector, а также вставка и удаление первого элемента.
Функции-члены последовательного контейнера vector:
push_back(T& key) добавление в конец;
pop_back() удаление с конца;
insert вставка в произвольное место;
erase удаление из произвольного места;
[] доступ к произвольному элементу;
swap обмен векторов;
clear очистка вектора;
Функции-члены последовательного контейнера list:
push_back(T& key) добавление в конец;
pop_back() удаление с конца;
push_front(T& key) добавление в начало;
pop_front() удаление из начала;
insert вставка в произвольное место;
erase удаление из произвольного места;
swap обмен списков;
clear очистка списка;
splice сцепка списков.
Функции-члены последовательного контейнера deque:
push_back(T& key) добавление в конец;
pop_back() удаление с конца;
insert вставка в произвольное место;
erase удаление из произвольного места;
push_front(T& key) добавление в начало;
pop_front() удаление из начала;
[] доступ к произвольному элементу;
Удаление из вектора элементов со 2 по 5:
v.erase(v.begin()+1,v.begin()+4);
Удаление из вектора последнего элемента:
v.pop_back();
Удаление из списка элементов со 2 по 5:
My_list lst;
My_list::iterator it2,it5;
it2=it5=lst.begin();
it2++;
for(int i=0;i<4;i++)
it5++;
lst.erase(it2,it5);
Удаление из списка последнего элемента:
lst.pop_back();
Удаление из очереди элементов со 2 по 5:
dq.erase(dq.begin()+1,dq.begin()+4);
Удаление из очереди последнего элемента:
dq.pop_back();
Печать последовательного контейнера
template <class T>
void print(T &cont1)
{
T::iterator p;
p=cont1.begin();
if (cont1.empty())
cout<<”Empty”<<endl;
else
{
for(;p!=cont1.end;p++)
cout<<*p<<” “;
cout<<endl;
}
}
Адаптер контейнера – это контейнер, созданный на основе базового и реализующий часть его операций, необходимых для функционирования адаптера.
stack<int> - стек по умолчанию, реализованный на базе двусторонней очереди, stack<int,list<int> > – стек на базе списка.
Методы контейнера stack:
push() добавление в конец;
pop() удаление с конца;
top() – получение последнего элемента;
empty() – проверка, является ли стек пустым;
size() – размер стека.
Методы контейнера queue:
push() добавление в конец;
pop() удаление из начала;
front() – получение первого элемента очереди;
back() – получение последнего элемента очереди;
empty() – проверка, является ли очередь пустой;
size() – размер очереди.
Из очереди с приоритетом (priority_queue) для извлечения выбирается максимальный среди хранимых элементов,
Непосредственно удалить из стека элемент с заданным номером нельзя. Для этого нужно последовательно извлечь все элементы до заданного, а затем добавить в обратном порядке все кроме него.
Непосредственно удалить из очереди элемент с заданным номером нельзя. Для этого нужно последовательно извлечь все элементы очереди, а затем добавить в том же порядке все кроме заданного.
Печать содержимого стека
template<class T>
void print_stack(stack<T> &st)
{
while (!st.empty())
{
cout<<st.top()<<” “;
st.pop();
}
cout<<endl;
}
Печать содержимого очереди
template<class T>
void print_queue (stack<T> &q)
{
while (!q.empty())
{
cout<<q.front()<<” “;
q.pop();
}
cout<<endl;
}