Стандартная библиотека C++ Состав библиотеки Потоковые классы Строковый
Стандартная библиотека C++
Состав библиотеки Потоковые классы Строковый класс Контейнерные классы – хранение данных Итераторы – доступ к элементам контейнерных классов Математические классы- обработка массивов и комплексных чисел Диагностические классы – идентификация типов данных STL
Строки string – новый тип данных #include “string” #include "string" #include "iostream" using namespace std; int main(int argc, char* argv[]) { string s1,s2,s3; char c1[80], c2[80], c3[80]; // Присваивание строк strcpy(c1, "old string one"); strcpy(c2, c1); s1 = "new string one"; s2 = s1; // Конкатенация строк strcpy(c3, c1); strcpy(c3, c2); s3 = s1 + s2; // Сравнение строк if (strcmp(c2, c3) < 0 ) cout <
Конструкторы строк и операторы присваивания string(); string(const char *); string(const char *, int); string(string &); string & operator=(const string & str ); string & operator=(const char * ); string & operator=(char c);
Операции
Добавление, вставка, удаление, замена частей строк Добавление строки: append(const string& str); append(const string& str, size_type pos, size_type n); append(const char* s, size_type n); Вставка подстроки: insert(size_type posl, const string& str); insert(size_type posl, const string& str, size_type pos2, size_type n); insert(size_type pos, const char* s, size_type n); Удаление: erase(size_type pos = 0, size_type n = npos); void clear(); Замена: replace(size_type posl, size_type nl, const string& str); replace(size_type posl, size_type nl, const string& str, size_type pos2, size_type n2); replace(size_type posl, size_type nl, const char* s, size_type n2);
Обмен строк, выделение подстроки, преобразование в массив char Обмен строк: swap(string& s); Выделение подстроки: string substr(size_type pos = 0, size_type n = npos) const; Преобразование в строку С const char* c_str() const; const char* data () const; size_type copy(char* s, size_type n, size_type pos = 0) const;
#include "string" #include "iostream" using namespace std; void main (){ string s1("прекрасная королева"), s2("лe"), s3("корова"); cout << "sl= "<< s1 << endl; cout << "s2= "<< s2 << endl ; cout << "s3= "<< s3 << endl; // Применение функции insert; cout << "после insert;" << endl; cout << "s3= " << s3.insert(4, s2) << endl; cout << "s3= " << s3.insert(7, "к") << endl; // Применение функции erase; s1.erase(0,3); cout << "после erase;" << endl; cout << "s1= " << s1 << endl; // Применение функции replace; cout << "после replace;" << endl; cout << "sl= " << s1.replace(0,3, s3, 4,2) << endl; }
Поиск подстрок Ищет самое левое вхождение строки str в вызывающую строку size_type find(const string& str, size_type pos = 0) const Ищет самое левое вхождение символа с в вызывающую строку size_type find(char с, size_type pos = 0) const; Ищет самое правое вхождение строки str в вызывающую строку size_type rfind(const string& str, size_type pos = npos) const; Ищет самое правое вхождение символа с в вызывающую строку size_type rfind(char с, size_type pos = npos) const; void main (){ string sl("лесная королева"), s2("ле"); cout << "sl= " << sl << endl; cout << "s2= " << s2 << endl; int i = sl.find(s2); int j = sl.rfind(s2); cout << "первое s2 в sl " << i << endl; cout << "последнее s2 в sl " << j << endl; cout << "первое 'о' в sl " << sl.find('о') << endl; cout << "последнее 'о' в sl " << sl.rfind('о') << endl; cout << "первое в s1 " << sl.find_first_of("a6вгде") << endl; cout << "последнее в si " << sl.find_last_of("a6вгдe") << endl; }
Сравнение частей строк int compare(const string& str) const; int compare(size_type pos1, size_type nl, const string& str) const; int compare(size_type pos1, size_type nl, const string& str, size_type pos2, size_type n2) const; void main (){ string s1("лесная королева"), s2("лe"), s3("корова"); cout << "sl= " <
Параметры строки size type size() const; // Количество элементов строки size_type length() const; // Количество элементов строки size_type max_size() const; // Максимальная длина строки size_type capacity() const; // Объем памяти, занимаемый // строкой bool_empty() const; // Истина, если строка пустая
КОНТЕЙНЕРНЫЕ КЛАССЫ Контейнерные классы — это классы, предназначенные для хранения данных, организованных определенным образом. Реализованы с помощью шаблонов классов, поэтому эту часть библиотеки C++ называют стандартной библиотекой шаблонов (STL — Standard Template Library). STL содержит контейнеры, реализующие основные структуры данных, используемые при написании программ — векторы, двусторонние очереди, списки и их разновидности, словари и множества. Контейнеры можно разделить на два типа; последовательные и ассоциативные. Последовательные контейнеры обеспечивают хранение конечного количества однотипных величин в виде непрерывной последовательности. векторы – класс vector двусторонние очереди – класс deque списки - класс list адаптеры: стеки (stack) очереди (queue) очереди с приоритетами (priority_queue). Ассоциативные контейнеры обеспечивают быстрый доступ к данным по ключу. Построены на основе сбалансированных деревьев. словари (mар), словари с дубликатами (multimap), множества (set), множества с дубликатами (multiset) битовые множества (bitset).
Пример с итераторами Итератор является аналогом указателя на элемент. Он используется для просмотра контейнера в прямом или обратном направлении. using namespace std; string str1 ( "No way out." ) ; basic_string
Работа с итераторами
Контейнеры обеспечивают стандартный интерфейс
Дополнительная информация
Последовательные контейнеры
Вектор – это структура, эффективно реализующая произвольный доступ к элементам, добавление в конец, удаление из конца Двусторонняя очередь эффективно реализует произвольный доступ к элементам, добавление в оба конца и удаление из обоих концов. Список эффективно реализует вставку и удаление элементов в произвольное место, но не имеет произвольного доступа к своим элементам.
Векторы - конструкторы explicit vector(); explicit vector(size_type n, const T & value = T()); template < class InputIter> vector(InputIter first, InputIter last); vector( const vector
Векторы – присваивание и копирование vector
Векторы – доступ к элементам вектора reference operator[](size_type n); const_reference operator[](size_type n) const; const_reference at(size_type n) const; reference at(size_type n); reference front(); const_reference front() const; reference back(); const_reference back() const; int main( ) { vector
Дополнительные методы size_type capacity() const - размер оперативной памяти, занимаемой вектором void reserve(size_type n) - позволяет задать, сколько памяти требуется для хранения вектора void resize(size_type sz, T с = Т()) - изменения размеров вектора Методы для изменения объектов класса vector: void push_back(const T& value); void pop_back(); iterator insert(iterator position, const T& value); void insert(iterator position, size_type n, const T& value); template
Операции сравнения Сравнение лексикографическое
Векторы – Изменение элементов #include “vector” #include “iostream” using namespace std; void main() { vector
#include “vector” #include “iostream” using namespace std; int main( ) { vector
Вектор логических значений vector < bool> Специализация нужна для оптимизации распределения памяти: 1 бит на каждый элемент template<> class vector< bool, allocator
Пример #include "vector" #include "iostream" using namespace std; void main(){ vector
Двусторонние очереди (deque) explicit deque(); explicit deque(size_type n, const T& value = T()); template
Конструкторы очереди (deque) // Создается очередь из 10 равных единице элементов: deque
Списки (list) Список поддерживает конструкторы, операцию присваивания, функцию копирования, операции сравнения и итераторы, аналогичные векторам и очередям. Доступ к элементам : reference front(); const_reference front() const; reference back(); const_reference back() const; Можно изменить размер списка: void resize(size_type sz, T с = Т()); Сцепка списков: void splice(iterator position, list
Списки (list) Упорядочивания элементов списка: void sort(); template
Списки (list) #include "list" #include "iostream" using namespace std; void main(){ list
Списки (list) void show (const char *str, const list
Стеки (stack) template
Стеки (stack) #include "vector" #include "stack" #include "iostream" #include
Очереди (queue) template
Очереди (queue) #include
Очереди с приоритетами (priority_queue) template
Очереди с приоритетами (priority_queue) #include "iostream" #include "vector" #include "functional" #include "queue" using namespace std; int main(){ priority_queue
Очереди с приоритетами (priority_queue) Можно задать стандартные шаблоны операций сравнения определенные в заголовочном файле
Ассоциативные контейнеры Пять типов: словари (mар), словари с дубликатами (multimap), множества (set), множества с дубликатами (multiset), битовые множества (bitset). Для хранения пары “ключ—элемент” используется шаблон pair, описанный в заголовочном файле
Ассоциативные контейнеры Операции: проверка на равенство и операция сравнения на меньше: пара p1 меньше пары р2, если p1.first < p2.first или p1.first == p2.first && p1.second < p2.second. присваивания значения: template
Словари (map) template
Словари (map) #include "fstream" #include "map" #include "iostream" #include "utility" #include "string" using namespace std; int main(){ map
Словари (map) #include "fstream" #include "map" #include "iostream" #include "utility" #include "string" using namespace std; int main(){ map
Словари (map) поиск элементов: iterator find(const key_type& x); const_iterator find(const key_type& x) const; iterator lower_bound(const key_type& x); const_iterator lower_bound(const key_type& x) const; iterator upper_bound(const key_type& x); const_iterator upper_bound(const keyjtype &x) const; size_type count(const key_type& x) const; getline(cin, str); if (ml.find(str) != ml.end()) cout << ml [str]; else{ cout << (*ml.upper_bound(str)).first << " " ; cout << (*ml.lower_bound(str)).first << " " ; }
Словари (map) вставка и удаление элементов : pair
Словари (map) #include "map" #include "iostream" #include "string" using namespace std; typedef map
Множества (set) Шаблон множества имеет два параметра; тип ключа и тип функционального объекта, определяющего отношение “меньше” : template
Множества (set) #include "iostream" #include "set" using namespace std; typedef set
Битовые множества (bitset) Параметром шаблона является длина битовой последовательности, которая должна быть константой: tempiate
Битовые множества (bitset) bitset <100> b1 // сто нулей bitset <16> b2 (0xf0f); // 0000111100001111 bitset <16> bЗ ("0000111100001111"); // 0000111100001111 bitset <5> b4 ("00110011", 3); // 10011 bitset <3> b5 ("00110101", 1, 3); // 011 С битовыми множествами можно выполнять следующие операции: bool operator==(const bitset
Битовые множества (bitset) В шаблоне bitset определены методы: unsigned long to_ulong() const; // в unsigned long string to_string() const; // в string size_t count() const; // количество битовых 1 size_t size() const; // количество битов bool test(size_t pos) const; // true, если b[pos] == 1 bool any() const; // true, если хотя бы один бит равен 1 bool none() const; // true, если ни один бит не равен 1 Определены операции ввода и вывода << и >>.
Битовые множества (bitset) #include "iostream" #include
Пример
7680-lekciya9._stl.ppt
- Количество слайдов: 55