
ООП v6.ppt
- Количество слайдов: 28
Библиотека стандартных шаблонов Standard Template Library 1
STL • Обеспечивает общецелевые, стандартные классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных • Алгоритмы и структуры применимы ко всем типам данных • Требует глубокого знания ООП, в частности шаблонов • Обзор основ и базовых операций 2
Обзор STL • Элементы библиотеки • Ядро: контейнеры, алгоритмы и итераторы • Контейнеры - объекты, предназначенные для хранения других объектов (vector, queue, list), а также функции для работы с ними. Ассоциативные контейнеры • Алгоритмы - выполняют операции над содержимым контейнера • Итераторы - объекты, являющиеся указателями для контейнеров. Получение доступа к содержимому контейнера 3
Итераторы • • • Произвольного доступа (random access) Двунаправленный (bidirectional) Однонаправленный (forward) Ввода (input) Вывода (output) Объявляется типом iterator 4
Дополнительные стандартные компоненты • Распределитель памяти (allocator) - управляет процессом распределения памяти • Предикат (predicate) - функция, возвращающая логическое значение • Функция сравнения (comparision function) специальные бинарный предикат (true a<b) 5
Классы-контейнеры • • • bitset - множество бит deque - двусторонняя очередь list - линейный список map - список ключ/значение multimap multiset - множество, элементы не уникальны priority_queue - очередь с приоритетом queue - очередь set - множество уникальных элементов stack - стек vector - динамический массив 6
Вектор • Динамический массив - размер увеличивается по мере необходимости • Для доступа может использоваться индексная нотация • Шаблон для класса вектор template <class T, class Allocator=allocator<T>>class vector 7
Пример Вектор vector <int> iv; vector<char> cv(5); vector<char> cv(5, ’a’); vector<int>iv 2(iv); Операторы сравнения ==, <, <=, !=, >, >=, [] - доступ к элементам вектора 8
Функции класса вектор (26) • size() - возвращает число хранящихся элементов • begin() - возвращает итератор первого элемента вектора • end() - возвращает итератор конца вектора • push_back() - добавляет в конец вектора элемент • insert() - вставка значения в вектор • erase() - удаление элементов вектора 9
Пример вектор #include <iostream> #include <vector> using namespace std; int main() // вывод на экран текущего размера вектора { cout << "Новый размер = " << v. size() << endl; vector<int> v; // создание вектора нулевой длины int i; // вывод на экран содержимого вектора cout << "Текущее содержимое: n"; // вывод на экран размера исходного вектора v for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << "Размер = " << v. size() << endl; cout << endl; // помещение значений в конец вектора, // по мере необходимости вектор будет расти for(i=0; i<10; i++) v. push_back(i); // изменение содержимого вектора for(i=0; i<v. size(); i++) v[i] = v[i] + v[i]; // вывод на экран текущего размера вектора v cout << "Новый размер = " << v. size() << endl; // вывод на экран содержимого вектора cout << "Удвоенное содержимое: n"; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; // вывод на экран содержимого вектора v cout << "Текущее содержимое: n"; } for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; // помещение новых значений в конец вектора, // и опять по мере необходимости вектор будет расти for(i=0; i<10; i++) v. push_back(i+10); 10
Пример Вектор Доступ к элементам через итератор и индекс #include <iostream> #include <vector> using namespace std; int main() { vector<int> v; // создание вектора нулевой длины int i; // помещение значений в вектор for(i=0; i<10; i++) v. push_back(i); // доступ к содержимому вектора // с использованием оператора индекса for(i=0; i<10; i++) cout << v[i] << " "; cout << endl; // доступ к вектору через итератор vector<int>: : iterator p = v. begin(); while(p != v. end)) { cout << *p << " "; p++; } } 11
Пример Вектор #include <iostream> #include <vector> using namespace std; int main() { vector<int> v(5, 1); // создание пятиэлементного вектора из единиц int i; cout << "Размер = " << v. size() << endl; cout << "Исходное содержимое: n"; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; vector<int>: : iterator p = v. begin(); p += 2; // указывает на третий элемент // удаление вставленных элементов p = v. begin(); p += 2; // указывает на третий элемент v. erase(p, p+10); // удаление следующих десяти элементов // за элементом, на который указывает // итератор p // вывод на экран размера // и содержимого вектора после удаления cout << "Размер после удаления=" << v. size(); cout << "Содержимое после удаления: n"; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; } // вставка в вектор на то место, // куда указывает итератор p десяти новых элементов, // каждый из которых равен 9 v. insert(p, 10, 9); cout << "Размер после вставки = " << v. size(); cout << "Содержимое после вставки: n"; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; 12
Пример Вектор #include <iostream> #include <vector> using namespace std; class Demo { double d; public: Demo() { d = 0. 0; } Demo(double x) { d = x; } int main() { vector<Demo> v; int i; for(i=0; i<10; i++) v. push_back(Demo(i/3. 0)); for(i=0; i<v. size(); i++) cout << v[i]. getd() << " "; Demo &operator=(double x) { d = x; return *this; } double getd() {returned d; } cout << endl; }; for(i=0; i<v. size(); i++) v[i] = v[i]. getd() * 2. 1; bool operator<(Demo a, Demo b) { return a. getd() < b. getd(); } bool operator==(Demo a, Demo b) { return a. getd() == b. getd(); } for(i=0; i<v. size(); i++) cout << v[i]. getd() << " "; return 0; } 13
Списки • Поддержка двунаправленных линейных списков • доступ к элементам только последовательный • доступ к элементам возможен с обеих сторон template <class T, class Allocator=allocator<T>>class list ==, <, <=, !=, >, >= • Функции класса list - 34 14
Пример Список #include <iostream> #include <list> using namespace std; int main() { list<char> lst; // создание пустого списка int i; for(i=0; i<10; i++) lst. push_back('A' + i); cout << "Размер = " << lst. size() << endl; list<char>: : iterator p; cout << "Содержимое: "; while(!lst. empty()) { p = lst. begin(); cout << *p; lst. pop_front(); } } 15
Пример Список #include <iostream> #include <list> #include <cstdlib> using namespace std; // сортировка списка lst. sort(); int main() { list<char> lst; int i; cout << "Отсортированное содержимое: "; p = lst. begin(); while(p != lst. end()) { cout << *p; p++; } // заполнение списка случайными символами for(i=0; i<10; i++) lst. push_back('A' + (rand()%26)); cout << "Исходное содержимое: "; list<char>: : iterator p = lst. begin(); while(p != lst. end()) { cout << *p; p++; } cout << endl; 16
Пример Список #include <iostream> #include <list> using namespace std; cout << endl; int main() { list<char> lst 1, lst 2; int i; // Слияние двух списков lst 1. merge(lst 2); if(lst 2. empty()) cout << "второй список пуст"; for(i=0; i<10; i+=2) lst 1. push_back('A' + i); for(i=1; i<11; i+=2) lst 2. push_back('A' + i); cout << "Содержимое первого списка: "; list<char>: : iterator p = lst 1. begin(); while(p != lst 1. end()) { cout << *p; p++; } cout << endl; cout << "Содержимое второго списка: "; p = lst 2. begin(); while(p != lst 2. end()) { cout << *p; p++; } p = lst 1. begin(); while(p != lst 1. end()) { cout << *p; p++; } return 0; } 17
Ассоциативные списки • map - каждому значению соответствует уникальный ключ • Значение извлекается из контейнера при помощи ключа • Ключи уникальны • Неуникальные ключи класс-контейнер multimap template<class Key, class T, class Comp=less<Key>, class Allocator = allocator <T> class map Comp - функция сравнения двух ключей ==, <, <=, !=, >, >= 18
Ассоциативные списки Пары ключ/значения хранятся в виде объектов pair Шаблон объекта pair template <class Ktype, class Vtype> struct pair{ typedef Ktype first_type; typedef Vtype second_type } first содержит и ключ и значение second содержит значение Создавать пары ключ/значение можно с использованием конструктора pair лил функции make_pair() 19
Пример map #include <iostream> #include <map> int main() { map<char, int> m; int i; // размещение пар в ассоциативном списке for(i=0; i<10; i++) { m. insert(pair<char, int>('A' + i, i)); } char ch; cout << "Введите ключ: "; cin >> ch; map<char, int>: : iterator p; // поиск значения по заданному ключу p = m. find(ch); if(p != m. end()) cout << p->second; else cout << "Такого ключа в ассоциативном списке нетn"; } 20
Пример map #include <iostream> #include <map> int main() { map<char, int> m; int i; // размещение пар в ассоциативном списке for(i=0; i<10; i++) { m. insert(make_pair(char)('A' + i, i)); } char ch; cout << "Введите ключ: "; cin >> ch; map<char, int>: : iterator p; // поиск значения по заданному ключу p = m. find(ch); if(p != m. end()) cout << p->second; else cout << "Такого ключа в ассоциативном списке нетn"; } 21
Алгоритмы • Предназначены для обработки контейнеров • Обеспечивают более широкие и комплексные действия, чем базовый набор операций контейнера • Одновременно можно работать с двумя контейнерами • <algorithm> • Количество алгоритмов порядка 57 групп 22
Пример Алгоритмы #include <iostream> #include <vector> #include <algoritm> int main() { vector<int> v; int i; count() - возвращает число элементов в последовательности с заданным значением for(i=0; i<20; i++) { if(i%2) v. push_back(1); else v. push_back(2); } cout << "Последовательность: "; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; int n; n = count(v. begin(), v. end(), 1); cout << n << " элементов равно 1n"; } 23
Пример Алгоритмы template<class In. Iter, class Out. Iter, class T> remove_copy(In. Iter begin, In. Iter end, Out. Iter result, const T &value) #include <vector> #include <algoritm> int main() { vector<int> v, v 2(20); int i; for(i=0; i<20; i++) { if(i%2) v. push_back(1); else v. push_back(2); } Алгоритм remove_copy копирует элементы, равные параметру значение, из заданного итераторами диапазона и размещает в результирующей последовательности cout << "Последовательность: "; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; // удаление единиц remove_copy(v. begin(), v. end(), v 2. begin(), 1); cout << "Результат: "; for(i=0; i<v 2. size(); i++) cout << v 2[i] << " "; cout << endl; } 24
Пример Алгоритмы template<class Bi. Iter> void reverse(Bi. Iter begin, Bi. Iter end) #include <iostream> #include <vector> #include <algoritm> using namespace std; int main() { vector<int> v; int i; Алгоритм reverse() меняет порядок расположения элементов на обратный for(i=0; i<10; i++) v. push_back(i); cout << "Исходная последовательность: "; for(i=0; i<v. size(); i++) cout << v[i] << " "; cout << endl; reverse(v. begin(), v. end()); cout << "Обратная последовательность: "; for(i=0; i<v. size(); i++) cout << v[i] << " "; } 25
Строковый класс • В С++ отсутствует строковый тип данных • Строковые массивы нельзя обрабатывать стандартными операторами С++ (+, =) • Обеспечение безопасности - выход за пределы массива • Итак: совместимость, удобство, безопасность • Класс string - интегрированный в среду разработки способ обработки строк 26
Пример строковый класс #include <iostream> #include <string> int main() { string str 1("Представление строк"); string str 2("Вторая строка"); string str 3; // строковому объекту можно присвоить //обычную строку str 1 = "Это обычная строкаn"; cout << str 1; // создание строкового объекта // с помощью другого строкового объекта string str 4(str 1); cout << str 4; // присваивание строк str 3 = str 1; cout << str 1 << "n" << str 3 << "n"; // конкатенация двух строк str 3 = str 1 + str 2; cout << str 3 << "n"; // ввод строки cout << "Введите строку: "; cin >> str 4; cout << str 4; } // сравнение строк if(str 3 > str 1) cout << "str 3 > str 1n"; if(str 3 == str 1+str 2) cout << "str 3 == str 1+str 2n"; 27
Пример строковый класс #include <iostream> #include <string> int main() { string str 1("Это проверка"); string str 2("АБВГДЕЖ"); cout << "Исходные строки: n" cout << "str 1: " << str 1 << endl; cout << "str 2: " << str 2 << "nn"; // работа функции insert() cout << "Вставка строки str 2 в строку str 1: n" str 1. insert(4, str 2); cout << str 1 << "nn"; // работа функции erase() cout << "Удаление семи символов из строки str 1: n" str 1. erase(4, 7); cout << str 1 << "nn"; // работа функции replace() cout << "Замена восьми символов из str 1 символами из str 2: n" str 1. replace(4, 8, str 2); cout << str 1 << "nn"; } 28
ООП v6.ppt