8427

Стандартная библиотека шаблонов

Лабораторная работа

Информатика, кибернетика и программирование

Стандартная библиотека шаблонов 1. Цель работы Освоить технологию обобщенного программирования с использованием библиотеки стандартных шаблонов (STL) языка C++. 2. Темы для предварительной проработки Классы. Наследование. 3. Задание для ...

Русский

2013-02-11

146.5 KB

25 чел.

Стандартная библиотека шаблонов

1. Цель работы

Освоить технологию обобщенного программирования с использованием библиотеки стандартных шаблонов (STL) языка C++.

2. Темы для предварительной проработки

  •  Классы.
  •  Наследование.

3. Задание для выполнения

    Написать три программы с использованием STL. Первая и вторая программы должны демонстрировать работу с контейнерами STL, третья − использование алгоритмов STL. Результат работы программ сохранить в файл.

Порядок выполнения работы.

Написать и отладить две программы. Первая программа демонстрирует использование контейнерных классов для хранения встроенных типов данных.

Вторая программа демонстрирует использование алгоритмов STL.

В программе № 1 выполнить следующее:

1. Создать объект-контейнер в соответствии с вариантом задания и заполнить его данными, тип которых определяется вариантом задания.

2. Просмотреть контейнер.

3. Изменить контейнер, удалив из него одни элементы и заменив другие.

4. Просмотреть контейнер, используя для доступа к его элементам итераторы.

5. Создать второй контейнер этого же класса и заполнить его данными того же типа, что и первый контейнер.

6. Изменить первый контейнер, удалив из него n элементов после заданного и добавив затем в него все элементы из второго контейнера.

7. Просмотреть первый и второй контейнеры.

В программе № 2 выполнить следующее:

1. Создать контейнер, содержащий объекты пользовательского типа. Тип контейнера выбирается в соответствии с вариантом задания.

2. Отсортировать его по убыванию элементов.

3. Просмотреть контейнер.

4. Используя подходящий алгоритм, найти в контейнере элемент, удовлетворяющий заданному условию.

5. Переместить элементы, удовлетворяющие заданному условию в другой (предварительно пустой) контейнер. Тип второго контейнера определяется вариантом задания.

6. Просмотреть второй контейнер.

7. Отсортировать первый и второй контейнеры по возрастанию элементов.

8. Просмотреть их.

9. Получить третий контейнер путем слияния первых двух.

10. Просмотреть третий контейнер.

11 .Подсчитать, сколько элементов, удовлетворяющих заданному условию, содержит третий контейнер.

12.Определить, есть ли в третьем контейнере элемент, удовлетворяющий заданному условию.

4. Варианты индивидуальных заданий

5. Пример контейнер vector-вектор

Вектор vector в STL определен как динамический массив с доступом

к его элементам по индексу.

template<class T,class Allocator=allocator<T>>class std::vector{…};

где T – тип предназначенных для хранения данных.

Allocator задает распределитель памяти, который по умолчанию является

стандартным.

В классе vector определены следующие конструкторы:

explicit vector(const Allocator& a=Allocator());

explicit vector(size_type число, const T&значение= T(), const Allocator&a=

=Allocator());

vector(const vector<T,Allocator>&объект);

template<class InIter>vector(InIter начало, InIter конец, const Allocator&a=

=Allocator());

Первая форма представляет собой конструктор пустого вектора.

Во второй форме конструктора вектора число элементов – это число,

а каждый элемент равен значению значение. Параметр значение может

быть значением по умолчанию.

Третья форма конструктора вектор – это конструктор копирования.

Четвертая форма – это конструктор вектора, содержащего диапазон

элементов, заданный итераторами начало и конец.

Пример 2.

vector<int> a;

vector<double> x(5);

vector<char> c(5,’*’);

vector<int> b(a); //b=a

Для любого объекта, который будет храниться в векторе, должен

быть определен конструктор по умолчанию. Кроме того, для объекта

должны быть определены операторы < и ==.

Для класса вектор определены следующие операторы сравнения:

==, <, <=, !=, >, >=.

Кроме этого, для класса vector определяется оператор индекса [].

• Новые элементы могут включаться с помощью функций

insert(), push_back(), resize(), assign().

• Существующие элементы могут удаляться с помощью функций

erase(), pop_back(), resize(), clear().

• Доступ к отдельным элементам осуществляется с помощью итерато-

ров

begin(), end(), rbegin(), rend(),

• Манипулирование контейнером, сортировка, поиск в нем и тому по-

добное возможно с помощью глобальных функций файла − заголовка <algorithm.

h>.

Пример 3.

#include<iostream.h>

#include<vector.h>

using namespace std;

85

void main()

{vector<int> v;

int i;

for(i=0;i<10;i++)v.push_back(i);

cout<<“size=”<<v.size()<<“\n”;

for(i=0;i<10;i++)cout<<v[i]<<“ ”;

cout<<endl;

for(i=0;i<10;i++)v[i]=v[i]+v[i];

for(i=0;i<v.size();i++)cout<<v[i]<<“ ”;

cout<<endl;

}

Пример 4. Доступ к вектору через итератор.

#include<iostream.h>

#include<vector.h>

using namespace std;

void main()

{vector<int> v;

int i;

for(i=0;i<10;i++)v.push_back(i);

cout<<“size=”<<v.size()<<“\n”;

vector<int>::iterator p=v.begin();

while(p!=v.end())

{cout<<*p<<” “;p++;}

}

Пример 5. Вставка и удаление элементов.

#include<iostream.h>

#include<vector.h>

using namespace std;

void main()

{vector<int> v(5,1);

int i;

//вывод

for(i=0;i<5;i++)cout<<v[i]<<“ ”;

cout<<endl;

vector<int>::iterator p=v.begin();

p+=2;

//вставить 10 элементов со значением 9

v.insert(p,10,9);

//вывод

p=v.begin();

while(p!=v.end())

{cout<<*p<<” “;p++;}

86

//удалить вставленные элементы

p=v.begin();

p+=2;

v.erase(p,p+10);

//вывод

p=v.begin();

while(p!=v.end())

{cout<<*p<<” “;p++;}

}

Пример 6. Вектор содержит объекты пользовательского класса.

#include<iostream.h>

#include<vector.h>

#include”student.h”

using namespace std;

void main()

{vector<STUDENT> v(3);

int i;

v[0]=STUDENT(“Иванов”,45.9);

v[1]=STUDENT(“Петров”,30.4);

v[0]=STUDENT(“Сидоров”,55.6);

//вывод

for(i=0;i<3;i++)cout<<v[i]<<“ ”;

cout<<endl;

}

Алгоритмы.

Каждый алгоритм выражается шаблоном функции или набором шаблонов функций. Таким образом, алгоритм может работать с очень разными контейнерами, содержащими значения разнообразных типов. Алгоритмы, которые возвращают итератор, как правило, для сообщения о неудаче используют конец входной последовательности. Алгоритмы не выполняют проверки диапазона на их входе и выходе. Когда алгоритм возвращает итератор, это будет итератор того же типа, что и был на входе. Алгоритмы в STL реализуют большинство распространенных универсальных операций с контейнерами, такие как просмотр, сортировка, поиск, вставка и удаление элементов.

Алгоритмы определены в заголовочном файле <algorithm.h>. Ниже приведены имена некоторых наиболее часто используемых функций-алгоритмов STL.

I. Немодифицирующие операции.

for_earch() выполняет операции для каждого элемента последовательности

find() находит первое вхождение значения в последовательность

find_if() находит первое соответствие предикату в последовательности

count() подсчитывает количество вхождений значения в последовательность

count_if() подсчитывает количество выполнений предиката в последовательности

search() находит первое вхождение последовательности как подпоследовательности

search_n() находит n-е вхождение значения в последовательность

II. Модифицирующие операции.

copy() копирует последовательность, начиная с первого элемента

swap() меняет местами два элемента

replace() заменяет элементы с указанным значением

replace_if() заменяет элементы при выполнении предиката

replace_copy() копирует последовательность, заменяя элементы с указанным значением

replace_copy_if() копирует последовательность, заменяя элементы при выполнении предиката

fill() заменяет все элементы данным значением

remove() удаляет элементы с данным значением

remove_if() удаляет элементы при выполнении предиката

remove_copy() копирует последовательность, удаляя элементы с указанным значением

remove_copy_if() копирует последовательность, удаляя элементы при выполнении предиката

reverse() меняет порядок следования элементов на обратный

random_shuffle() перемещает элементы согласно случайному равномерному распределению (“тасует” последовательность)

transform() выполняет заданную операцию над каждым элементом последовательности

unique() удаляет равные соседние элементы

unique_copy() копирует последовательность, удаляя равные соседние элементы

III. Сортировка.

sort() сортирует последовательность с хорошей средней эффективностью

partial_sort() сортирует часть последовательности

stable_sort() сортирует последовательность, сохраняя порядок следования равных элементов

lower_bound() находит первое вхождение значения в отсортированной последовательности

upper_bound() находит первый элемент, больший чем заданное значение

binary_search() определяет, есть ли данный элемент в отсортированной последовательности

merge() сливает две отсортированные последовательности

IV. Работа с множествами.

includes() проверка на вхождение

set_union() объединение множеств

set_intersection() пересечение множеств

set_difference() разность множеств

V. Минимумы и максимумы.

min() меньшее из двух

max() большее из двух

min_element() наименьшее значение в последовательности

max_element() наибольшее значение в последовательности

VII. Перестановки.

next_permutation() следующая перестановка в лексикографическом порядке

pred_permutation() предыдущая перестановка в лексикографическом порядке


 

А также другие работы, которые могут Вас заинтересовать

14534. БРЮССЕЛЬСКИЙ ДОГОВОР 1965 ГОДА 19.03 KB
  Брюссельский Договор 1965 года В ЕЭС как и в Евратоме были созданы институты почти повторившие те которые существовали в ЕОУС. Существование параллельных институтов в ЕЭС и в Евратоме сразу было признано нецелесообразным. Об этом было заявлено в конвенции принятой в Ри
14535. ПЕРВОЕ РАСШИРЕНИЕ ЕВРОПЕЙСКИХ СООБЩЕСТВ (1973, 1981, И 1986 ГОДА) 19.89 KB
  Первое расширение Европейских Сообществ 1973 1981 и 1986 года Интеграционные процессы в Европе привели к эффективной работе Таможенного Союза который способствовал развитию торговли. Сообщества сумели преодолеть экономические трудности 1970 годов. Бюджет сообществ начал
14536. АМСТЕРДАМСКИЙ ДОГОВОР (1997 ГОД). ПРОБЛЕМЫ ДАЛЬНЕЙШЕГО РАСШИРЕНИЯ И УГЛУБЛЕНИЯ «ИНТЕГРАЦИОННОГО СТРОИТЕЛЬСТВА» 19.74 KB
  Амстердамский Договор 1997 год. Проблемы дальнейшего расширения и углубления Интеграционного Строительства. Маастрихтский договор оставил ряд нерешённых проблем. Разрешить эти проблемы должна была новая межправительственная конференция которая началась в 1996 году. ...
14537. Філософія та наука: історія і сучасність 191.5 KB
  За таких умов докорінному перегляду піддаються всі аспекти наукової практики. Постає нове розуміння місця наукового знання в культурі.
14538. НИЦЦКИЙ ДОГОВОР (2001 ГОД). ИНТЕГРАЦИЯ ПО ВСЕМ НАПРАВЛЕНИЯМ 22.7 KB
  Ниццкий Договор 2001 год. Интеграция по всем направлениям В начале 1999 года Единая Европа вступила в новый этап своего развития. С 1 января 1999 года начала функционировать первая опора ЕС. В феврале 2000 года для обсуждения очередного редакционного обновления учредительн
14540. ИНСТИТУТЫ ЕС: ЕВРОПЕЙСКИЙ СУД 87 KB
  Институты ЕС: Европейский Суд. Оглавление [1] Институты ЕС: Европейский Суд. [2] Оглавление [3] Введение [4] Структура Суда [5] Состав Суда [6] Рассмотрение дел [7] Юрисдикция Суда [8] Суд первой инстанц
14541. ИНСТИТУТЫ ЕС: СЧЁТНАЯ ПАЛАТА 25.22 KB
  Институты ЕС: Счётная Палата I. Европейская счетная палата 1.СозданииЕвропейской счетной палаты 2.Мандатчленов Европейской счетной палаты. Полномочия. 3.Состав Европейской счетной палаты. 4.Организационная структура Европейской счетной палаты 5.Сотрудничествос...
14542. ЕВРОПЕЙСКИЙ ИНВЕСТИЦИОННЫЙ БАНК 24.63 KB
  Европейский Инвестиционный Банк IV.Европейский инвестиционный банк Состав банка Роль банка Организация работы Совет управляющих Европейский инвестиционный банк Е1В финансовое учреждение Европейского союза задуман и действует как банк и в то же время как евро