- •Содержание
- •1. Пары
- •2. Контейнеры stl
- •3. Алгоритмы stl
- •4. Адаптеры контейнеров
- •5. Ассоциативные контейнеры
- •5.1. Множества и мультимножества
- •5.2 Отображения и мультиотображения
- •6. Строки
- •7. Потоки ввода-вывода
- •8. Итераторы
- •9. Управление памятью. Класс auto_ptr
- •Список использованных источников
Содержание
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