Стандартная библиотека Стандартную библиотеку С++ можно разделить на 2 части: n функции, макросы, типы, константы, унаследованные от С; n классы и шаблоны от С++. 1
Классы стандартной библиотеки: Потоковые классы Строковый класс Контейнерные классы Алгоритмы Итераторы Математические классы Диагностические классы Остальные классы STL 2
n n Потоковые классы предназначены для управления потоками данных между оперативной памятью и внешними устройствами. Строковый класс предназначен для удобной и защищённой от ошибок работы с символьными строками; Контейнерные классы реализуют наиболее распространённые структуры для хранения данных (списки, вектора, множества), а также алгоритмы, использующие эти контейнеры; Итераторы предназначены для унифицированного доступа к элементам контейнерных и других классов; 3
Математические классы поддерживают эффективную обработку массивов с плавающей точкой и работу с комплексными числами; n Диагностические классы обеспечивают динамическую идентификацию типов и объектноориентированную обработку ошибок; n Остальные классы обеспечивают динамическое распределение памяти, обработку функциональных объектов и т. д. n 4
Поток это абстрактное понятие, относящееся к любому переносу данных от источника к приёмнику. 5
Поток n n n Поток определяется как последовательность байтов и не зависит от конкретного устройства. Обмен с потоком производится, как правило, через буфер. Чтение данных из потока называется извлечением, вывод в поток — помещением, или включением. По направлению обмена потоки можно разделить на входные, выходные и двунаправленные. По виду устройств, с которыми работает поток, можно разделить потоки на стандартные, файловые и строковые 6
Иерархия потоковых классов streambuf ios istream ifstream ofstring stream istring stream ofstream iostream stringstream fstream 7
Классы потоков n n n ios — общие для ввода/вывода поля и методы Streambuf - буферизация потоков и их взаимодействие с физич. устройствами istream — входные потоки ostream — выходные потоки iostream — двунаправленные потоки istringstream — входные строковые ostringrstream — выходные строковые stringstream — двунаправленные строковые ifstream — входные файловые ofstream — выходные файловые fstream — двунаправленные файловые 8
Заголовочные файлы n n n n <ios> - базовый класс потоков в/в <istream> - шаблон потока ввода <ostream> - шаблон потока вывода <iostream> - стандартные объекты и операции с потоками в/в <fstream> - потоки в/в в файлы <sstream> - потоки в/в в строки <streambuf> - буферизация потоков в/в <iomanip> - манипуляторы 9
Преимущества и недостатки потоков n n Основным преимуществом потоков по сравнению с функциями ввода/вывода, унаследованными из библиотеки С, является контроль типов, а также расширяемость; потоки могут работать с расширенным набором символов wchar_t. К недостаткам потоков можно отнести снижение быстродействия программы 10
Стандартные потоки Объект n cin n cout n cerr n clog Класс istream ostream операции извлечения из потока >> и помещения в поток << определены путем перегрузки операций сдвига << и >>. 11
Операции << и >> в качестве результата выполнения формируют ссылку на объект типа istream для извлечения и на объект ostream для чтения. Это позволяет формировать цепочки операций. 12
Операции << и >> n n Числовые значения можно вводить в десятичной или шестнадцатеричной системе счисления (с префиксом 0 x) со знаком или без знака. Вещественные числа представляются в форме с фиксированной точкой или с порядком. При вводе строк извлечение происходит до ближайшего пробела Значения указателей выводятся в шестнадцатеричной системе счисления. Под любую величину при выводе отводится столько позиций, сколько требуется для ее представления. 13
Форматирование данных В потоковых классах форматирование выполняется с помощью q флагов q манипуляторов q форматирующих методов. 14
Флаги - отдельные биты, объединённые в поле x_flags класса ios. Флаг Положение Действие skipws 0 x 0001 Пробельные символы игнорируются при вводе hex 0 x 0040 Шестнадцатеричная СС showbase 0 x 0080 Выводится основание СС uppercase 0 x 0200 При выводе использовать символы верхнего регистра fixed Вывод веществ. чисел в форме с фиксир. точкой 0 x 1000 15
Форматирующие методыэто методы для управления флагами: - setf() – устанавливает флаги; - unsetf() - сбрасывает флаги; - width() – устанавливает ширину поля вывода в соответствии со значением параметра; - fill () – устанавливает значение текущего символа заполнения. 16
Использование флагов и форматирующих методов #include <iostream> int main(){ long a = 1000, b = 077; cout. width(7); cout. setf(ios: : hex | ios: : showbase | ios: : uppercase); cout << a; cout. width(7); cout << b << endl; double d = 0. 12, c = 1. 3 e-4; cout. setf(ios: : left); cout << d << endl; cout << c; return 0; } 0 X 3 E 8 0 X 3 F 0. 12 0. 00013 17
Манипуляторы - это функции, которые можно включать в цепочку операций помещения и извлечения для форматирования данных. 18
Примеры манипуляторов hex – устанавливает флаг восьмеричной СС; oct - устанавливает флаг шестнадцатеричной СС; setfill – устанавливает символзаполнитель; setprecision – максимальное кол-во цифр в дробной части; setiosflags – устанавливает флаги состояния потока; setw – устанавливает максимальную ширину поля вывода. 19
Использование манипуляторов #include <iostream> #include <iomanip> int main(){ double d[] = {1. 234, -12. 34567, 123. 456789, -1. 234, 0. 00001}; cout << 13 << hex << ' ' << 13 << oct << ' ' << 13 << endl; cout << setfill('. ') << setprecision(4) << setiosflags(ios: : showpoint | ios: : fixed); for (int i = 0; i < 5; i++) cout << setw(12) << d[i] << endl; return 0; . . . 1. 2340 } 13 d 15. . -12. 3457 20
Методы обмена с потоками Программа считывает строки из входного потока в символьный массив. #include "iostream. h" int main(){ const int N = 20, Len = 100; char str[N][Len]; int i = 0; while (cin. getline(str[i], Len, 'n') && i<N){ // … i++; } return 0; } 21
Пример Программа считывает либо строки, либо целые числа из файла char str[80], *p; ifstream in("test"); do{p = str; ch = in. peek(); if(isdigit(ch)){ while(isdigit(*p = in. get())) p++; in. putback(*p); *p = '