Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практика.docx
Скачиваний:
9
Добавлен:
09.06.2015
Размер:
79.45 Кб
Скачать

32

Содержание

1. Пары 3

2. Контейнеры STL 5

3. Алгоритмы STL 9

4. Адаптеры контейнеров 12

5. Ассоциативные контейнеры 15

5.1 Множества и мультимножества 15

5.2 Отображения и мультиотображения 17

6. Строки 19

7. Потоки ввода-вывода 23

8. Итераторы 26

9. Управление памятью. Класс auto_ptr 30

Список использованных источников 32

1. Пары

Тип pair позволяет работать с двумя величинами как с единым целым. Данный тип применяется чаще всего при работе с объектами, которые представляют собой пары "ключ/значение", или, например, когда необходимо получить функцию, возвращающую два значения.[1]

Ниже представлен листинг программы, которая выводит имена по заданной дате. В программе использовался контейнер vector, содержащий пары, в которых первый элемент – имя, а второй – дата.

#include <iostream>

#include <vector>

#include <fstream>

#include <string>

#include <utility>

using namespace std;

int main()

{

vector<pair<string, string>> vec;

string name, date, date_find;

fstream in ("input_task1.txt");

pair<string, string> temp_pair;

/* заполнение вектора пар,

где первый (first) элемент пары - имя, а второй (second) –

дата*/

while (in.peek()!=EOF){

getline(in,name);

getline(in,date);

temp_pair.first=name;

temp_pair.second=date;

vec.push_back (temp_pair);

}

in.close();

/*ввод даты, поиск и вывод имён по заданной дате*/

cout<<"enter date:";

getline (cin,date_find);

for (vector<pair<string, string>>::iterator iter=vec.begin();

iter<vec.end() ; ++iter){

if(date_find == iter->second)

cout<<iter->first<<endl ;

}

return 0;

}

Содержимое входного файла:

Name1

2000

Name2

2001

Name3

2000

Name4

2004

Name5

2005

Name6

2006

Name7

2007

Name8

2000

Name9

2009

Результат работы программы:

enter date:2000

Name1

Name3

Name8

2. Контейнеры stl

Контейнеры в STL представляют собой объекты, которые хранят коллекции других объектов.

В STL имеются следующие контейнеры. [2]

  • vector <T>. Вектором называется абстрактная модель, имитирующая динамический массив при операциях с элементами. Элементы вектора копируются во внутренний динамический массив. Элементы всегда хранятся в определённом порядке. Вектор обеспечивает произвольный доступ к своим элементам. Итераторы вектора являются итераторами произвольного доступа, что позволяет применять к векторам все алгоритмы STL. [1]

  • deque <T>. Дек тоже работает с элементами, оформленными в динамический массив, поддерживает произвольный доступ и обладает практически тем же интерфейсом. Различие заключается в том, что динамический массив дека открыт с обоих концов. [1]

  • list <T>. Обеспечивает линейное время доступа к последовательности переменной длины, но с константным временем вставки и удаления в любом месте последовательности. [2]

Ниже приведён листинг программы, которая удаляет из вектора, дека и списка повторяющиеся числа, оставляя лишь один экземпляр.

#include <iostream>

#include <vector>

#include <deque>

#include <list>

#include <fstream>

#include <time.h>

using namespace std;

int main()

{

ifstream in("input_task2.txt");

list<double> lt;

deque<double> deq;

vector<double> vec;

double element;

while(!in.eof()) {

in>>element;

vec.push_back (element);

deq.push_back (element);

lt.push_back (element);

}

in.close();

/*удаление элементов в векторе*/

clock_t startClock = clock();

for (vector<double>::iterator iter = vec.begin(); iter !=

vec.end(); ++iter){

for(vector<double>::iterator iter1 = iter + 1; iter1 !=

vec.end(); ++iter1){

if(*iter==*iter1){

vec.erase(iter1--);

}

}

}

clock_t endClock=clock();

double vectorTime = difftime(endClock,startClock);

/*удаление элементов в деке*/

startClock=clock();

for (int i=0; i<deq.size(); ++i){

for (int j=i+1; j<deq.size(); ++j){

if (deq[i] == deq[j]){

deq.erase(deq.begin() + j);

j--;

}

}

}

endClock=clock();

double dequeTime = difftime(endClock,startClock);

/*удаление элементов в списке*/

startClock=clock();

list<double>::iterator iter_lt=lt.begin();

for (list<double>::iterator iter=lt.begin(); iter!=lt.end();

++iter){

iter_lt=iter;

++iter_lt;

while(iter_lt!=lt.end()){

if(*iter_lt==*iter){

lt.erase(iter_lt--);

}

++iter_lt;

}

}

endClock=clock();

double listTime = difftime(endClock,startClock);

ofstream out ("output.txt");

/*запись результата работы вектора в фаил*/

out<<"vector:\n";

for (vector<double>::iterator iter=vec.begin();

iter<vec.end(); ++iter){

out<<*iter<<" ";

}

out<<"\ntime: "<<vectorTime;

/*запись результата работы дека в фаил*/

out<<"\n\n\ndeque:\n";

for (deque<double>::iterator iter=deq.begin(); iter<deq.end();

++iter){

out<<*iter<<" ";

}

out<<"\ntime: "<<dequeTime;

/*запись результата работы списка в фаил*/

out<<"\n\n\nlist:\n";

for (list<double>::iterator iter=lt.begin(); iter!=lt.end();

++iter){

out<<*iter<<" ";

}

out<<"\ntime: "<<listTime;

out.close();

return 0;

}

Входной файл содержит числа: 3 2 1 4 2 3 4 8 9 17 9 2 3 4 2 9 9… Эта последовательность чисел повторяется несколько раз, чтобы измерить скорость удаления элементов.

Результат работы программы:

vector:

3 2 1 4 8 9 17

time: 8

deque:

3 2 1 4 8 9 17

time: 169

list:

3 2 1 4 8 9 17

time: 7