Октябрь 2008 1 Стандартные библиотеки С++. Октябрь 20082 История возникновения В программах на С++ часто приходится выполнять однообразные действия, для.

Презентация:



Advertisements
Похожие презентации
Потоковые классы Потоки – последовательности байт, связанные с файлом либо с устройством ввода/вывода. Потоки по направлению обмена делятся на входные,
Advertisements

Стандартная библиотека шаблонов (STL) Контейнеры –структуры для хранения данных. Алгоритмы – шаблонные универсальные функции для обработки данных Итераторы.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
Потоки Язык C++ не обеспечивает средств для ввода/вывода Ему это и не нужно; такие средства легко и элегантно можно создать с помощью самого языка Традиционно.
Форматирование Библиотека потоков С++ предусматривает три способа управления форматов выходных данных: вызов форматирующих функций-элементов использование.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
1 Программирование на языке Си++. 2 Модуль 4. ПЕРЕГРУЗКА ОПЕРАЦИЙ Методы преобразования. Классы потоков Си++ Операции замещения и вставки Ввод/вывод в.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Язык программирования Си Приведение типов, операции Потоковый ввод-вывод Югов Иван Олегович МОУ Гимназия 10, г. Тверь.
Данные в программах и алгоритмах Программы и их алгоритмы пишутся для обработки данных. Чтобы реализовать алгоритм, программам необходимо работать с данными.
Коллекции классов Лекция 12. С помощью коллекций вместо создания структур данных программист использует готовые структуры данных, не заботясь об их реализации.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
C++ Лекция 1. Литература Шилдт Г. С++: базовый курс.-М.:Вильямс, с. Шилдт Г. Самоучитель С++. - СПб.: БХВ-Петербург, – 687 с. Б. Пахомов.
Потоки (файлы) Функции и типы для работы с потоками в стиле С описаны в модуле stdio.h. В отличие от Паскаля в С с потоком не связан тип данных. Поток.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
План-конспект урока (информатика и икт, 9 класс) по теме: Переменные:тип, имя, значение
Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Pascal 1 Основы языка Паскаль Информатика и ИКТ Смирнов М.В. МКО ООШ п. Климковка Белохолуницкого района Кировской области.
Лабораторная работа 7. Работа с динамической памятью, строками и файлами.
Транксрипт:

Октябрь Стандартные библиотеки С++

Октябрь История возникновения В программах на С++ часто приходится выполнять однообразные действия, для которых в языке нет стандартных средств, или такие средства не достаточно удобны. В программах на С++ часто приходится выполнять однообразные действия, для которых в языке нет стандартных средств, или такие средства не достаточно удобны. Производители компиляторов и сред разработки предлагают средства для облигчения написания программ: Производители компиляторов и сред разработки предлагают средства для облигчения написания программ: Библиотеки функций Библиотеки функций Библиотеки классов Библиотеки классов Часть средств была стандартизована и обычно поставляется с любым компилятором С++. Часть средств была стандартизована и обычно поставляется с любым компилятором С++. Некоторые средства приобрели такую популярность, что реализованы в современных языках как часть языка программирования. Некоторые средства приобрели такую популярность, что реализованы в современных языках как часть языка программирования.

Октябрь Основные вопросы Строки Строки Потоковые классы Потоковые классы Стандартная библиотека шаблонов (STL) Стандартная библиотека шаблонов (STL)

Октябрь Строки C++ не содержит стандартного типа данных «строка». Вместо этого он поддерживает массивы символов, завершаемые нуль- символом. C++ не содержит стандартного типа данных «строка». Вместо этого он поддерживает массивы символов, завершаемые нуль- символом. Они позволяют достичь высокой эффективности, но весьма неудобны и небезопасны в использовании, поскольку выход за границы строки не проверяется. Они позволяют достичь высокой эффективности, но весьма неудобны и небезопасны в использовании, поскольку выход за границы строки не проверяется. Тип данных string стандартной библиотеки лишен этих недостатков, но может проигрывать массивам символов в эффективности. Тип данных string стандартной библиотеки лишен этих недостатков, но может проигрывать массивам символов в эффективности. Основные действия со строками выполняются в нем с помощью операций и методов, а длина строки изменяется динамически в соответствии с потребностями. Строки типа string защищены от выхода информации за их границы и с ними можно работать так же, как с любым встроенным типом данных. Основные действия со строками выполняются в нем с помощью операций и методов, а длина строки изменяется динамически в соответствии с потребностями. Строки типа string защищены от выхода информации за их границы и с ними можно работать так же, как с любым встроенным типом данных. Для использования класса необходимо подключить к программе заголовочный файл. Для использования класса необходимо подключить к программе заголовочный файл.

Октябрь Пример использования string #include #include using namespace std; int main (){ char c1[80], c2[80], сЗ[80];// Строки с завершающим нулим string s1, s2, s3; // Присваивание строк strcpy(c1, "old string one"); strcpy(c2, cl); s1 = "new string one"; s2 = s1; // Конкатенация строк strcpy(c3, c1); strcat(c3, c2); s3 = s1 + s2; // Сравнение строк if (strcmp(c2, c3) < 0 ) …; else …; if (s2 < s3) …; else …; }

Октябрь Конструкторы и присваивание строк Конструкторы: Конструкторы: string(); string(); string(const char *); string(const char *); string(const char *, int n); string(const char *, int n); string(string&); string(string&); Операторы присваивания Операторы присваивания string& operator=(const string& str); string& operator=(const string& str); string& operator=(const char* s); string& operator=(const char* s); string& operator=(char c); string& operator=(char c); Примеры: Примеры: string s1; string s1; string s2("Вася"); string s2("Вася"); string s3(s2); string s3(s2); s1 = 'X'; s1 = 'X'; s1 = "Вася"; s1 = "Вася"; s2 = s3; s2 = s3;

Октябрь Операции Операция Действие ОперацияДействие = присваивание >больше + конкатенация >=больше или равно == равенство [ ]индексация != неравенство «вывод < меньше »ввод <= меньше или равно +=добавлиние

Октябрь Методы Вставка Вставка insert(size_type pos, const string& str): insert(size_type pos, const string& str): insert(size_type pos, const string& str, size_type pos2, size_type n); insert(size_type pos, const string& str, size_type pos2, size_type n); insert(size_type pos, const char* s, size_type n); insert(size_type pos, const char* s, size_type n); Удалиние Удалиние erase(size_type pos = 0, size_type n = npos); erase(size_type pos = 0, size_type n = npos); clear(); clear(); Выделиние подстроки Выделиние подстроки string substr(size_type pos = 0, size_type n = npos); string substr(size_type pos = 0, size_type n = npos); Преобразование в массив символов Преобразование в массив символов const char* c_str(); const char* c_str(); Поиск подстрок Поиск подстрок size_type find(const string &s, size_type pos = 0); size_type find(const string &s, size_type pos = 0); size_type find(char с, size_type pos = 0); size_type find(char с, size_type pos = 0); size_type rfind(const string& str, size_type pos = npos); size_type rfind(const string& str, size_type pos = npos); size_type rfind(char с, size_type pos = npos); size_type rfind(char с, size_type pos = npos); size_type find_first_of(char с, size_type pos = 0); size_type find_first_of(char с, size_type pos = 0); size_type find_last_of(char с, size_type pos = npos); size_type find_last_of(char с, size_type pos = npos); size_type find_first_of(const string& str, size_type pos = 0); size_type find_first_of(const string& str, size_type pos = 0); size_type find_last_of(const string& str, size_type pos = npos); size_type find_last_of(const string& str, size_type pos = npos); …

Октябрь Пример применения методов поиска #include #include using namespace std; int main (){ string s1("лисная королива"), s2("ли"); cout « "s1= " « s1 « endl; cout « "s2= " « s2 « endl; int i = s1.find(s2); int j = s1.rfind(s2); cout « "первое s2 в s1 " « i « endl; cout « "послиднее s2 в s1 " « j « endl; cout « "первое 'о' в s1 " « s1.find('o') « endl; cout « "послиднее 'о' в s1 " « s1.rfind('o') « endl; cout « "первое в s1 " « s1.find_first_of(«абвгд») « endl; cout « "послиднее в s1 " « s1.find_last_of(«абвгд») « endl; } Результат работы программы: sl= лисная королива s2= ли первое s2 в s1 0 послиднее s2 в s1 11 первое 'о' в s1 8 послиднее 'о' в s1 10 первое в s1 1 послиднее в s1 14

Октябрь Получение характеристик строк size_type size() const;// Количество элиментов строки size_type size() const;// Количество элиментов строки size_type length() const;// Количество элиментов строки size_type length() const;// Количество элиментов строки size_type max_size() const; // Максимальная длина строки size_type max_size() const; // Максимальная длина строки size_type capacity() const; // Объем памяти, занимаемый строкой size_type capacity() const; // Объем памяти, занимаемый строкой bool empty() const;// Истина, если строка пустая bool empty() const;// Истина, если строка пустая

Октябрь Потоковые классы Поток это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику. Поток это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику. Потоки C++ обеспечивают Потоки C++ обеспечивают надежную работу как со стандартными, так и с определинными пользователим типами данных, надежную работу как со стандартными, так и с определинными пользователим типами данных, единообразный и понятный синтаксис. единообразный и понятный синтаксис. Чтение данных из потока называется извличением, вывод в поток помещением, или включением. Чтение данных из потока называется извличением, вывод в поток помещением, или включением. Поток определяется как послидовательность байтов и не зависит от конкретного устройства, с которым производится обмен (оперативная память, файл на диске, клавиатура или принтер). Поток определяется как послидовательность байтов и не зависит от конкретного устройства, с которым производится обмен (оперативная память, файл на диске, клавиатура или принтер). По направлинию обмена потоки можно разделить на По направлинию обмена потоки можно разделить на входные (данные вводятся в память), входные (данные вводятся в память), выходные (данные выводятся из памяти) выходные (данные выводятся из памяти) двунаправлинные (допускающие как извличение, так и включение). двунаправлинные (допускающие как извличение, так и включение). По виду устройств, с которыми работает поток: По виду устройств, с которыми работает поток: Стандартные (для передачи данных от клавиатуры и на экран дисплия), Стандартные (для передачи данных от клавиатуры и на экран дисплия), Файловые (для обмена информацией с файлами на внешних носителях данных ), Файловые (для обмена информацией с файлами на внешних носителях данных ), Строковые (для работы с массивами символов в оперативной памяти). Строковые (для работы с массивами символов в оперативной памяти).

Октябрь Иерархия классов для поддержки потоков Базовые классы: Базовые классы: ios – содержит общие для ввода и вывода поля и методы, ios – содержит общие для ввода и вывода поля и методы, streambuf обеспечивает буферизацию потоков и их взаимодействие с физическими устройствами. streambuf обеспечивает буферизацию потоков и их взаимодействие с физическими устройствами. От этих классов наслидуется класс istream для входных потоков и ostream для выходных. От этих классов наслидуется класс istream для входных потоков и ostream для выходных. Два послидних класса являются базовыми для класса iostream, реализующего двунаправлинные потоки. Два послидних класса являются базовыми для класса iostream, реализующего двунаправлинные потоки. Ниже в иерархии располагаются файловые и строковые потоки: Ниже в иерархии располагаются файловые и строковые потоки: istringstream – класс входных строковых потоков; istringstream – класс входных строковых потоков; ostringstream – класс выходных строковых потоков; ostringstream – класс выходных строковых потоков; iostringstream – класс двунаправлинных строковых потоков; iostringstream – класс двунаправлинных строковых потоков; ifstream класс входных файловых потоков; ifstream класс входных файловых потоков; ofstream класс выходных файловых потоков; ofstream класс выходных файловых потоков; fstream класс двунаправлинных файловых потоков. fstream класс двунаправлинных файловых потоков.

Октябрь Основные заголовочные файлы с описаниями классов потоков #include – стандартные объекты и операции с потоками ввода/вывода; #include – стандартные объекты и операции с потоками ввода/вывода; #include – потоки ввода/вывода в файлы; #include – потоки ввода/вывода в файлы; #include – потоки ввода/вывода в строки; #include – потоки ввода/вывода в строки; Необходимо использовать пространство имен std Необходимо использовать пространство имен std using namespace std; using namespace std; Недостаток потоков – снижение быстродействия, для некоторых компиляторов может быть весьма значительным. Недостаток потоков – снижение быстродействия, для некоторых компиляторов может быть весьма значительным.

Октябрь Стандартные потоки Заголовочный файл содержит, кроме описания классов для ввода/вывода, четыре предопределинных объекта: Заголовочный файл содержит, кроме описания классов для ввода/вывода, четыре предопределинных объекта: Объект КлассОписание cinistream Связывается с клавиатурой (стандартным буферизованным вводом) coutostream Связывается с экраном (стандартным буферизованным выводом) cerrostream Связывается с экраном (стандартным небуферизованным выводом), куда направляются сообщения об ошибках clogostream Связывается с экраном (стандартным буферизованным выводом), куда направляются сообщения об ошибках В классах istream и ostream операции извличения из потока » и помещения в поток « определины путем перегрузки операций сдвига.

Октябрь Пример использования стандартных потоков #include #include int main(){ int i; cin » i; cout « "Вы ввели " « i; return 0; } Операции извличения и чтения в качестве результата своего выполнения формируют ссылку на объект типа istream для извличения и ссылку на ostream для чтения. Операции извличения и чтения в качестве результата своего выполнения формируют ссылку на объект типа istream для извличения и ссылку на ostream для чтения.

Октябрь Особенности ввода Помещение в буфер ввода происходит посли нажатия клавиши перевода строки, посли чего из буфера выполняется операция извличения из потока. Помещение в буфер ввода происходит посли нажатия клавиши перевода строки, посли чего из буфера выполняется операция извличения из потока. Это дает возможность исправлять введенные символы до того, как нажата клавиша Enter. Это дает возможность исправлять введенные символы до того, как нажата клавиша Enter. При вводе строк извличение происходит до ближайшего пробела (вместо него в строку заносится нуль-символ): При вводе строк извличение происходит до ближайшего пробела (вместо него в строку заносится нуль-символ): char str1[100], str2[100]; cin » str1 » str2; Если с клавиатуры вводится строка "раз два три четыре пять", переменные str1 и str2 примут значения "раз" и "два" соответственно, а остаток строки воспринят не будет. Если с клавиатуры вводится строка "раз два три четыре пять", переменные str1 и str2 примут значения "раз" и "два" соответственно, а остаток строки воспринят не будет. При необходимости ввести из входного потока строку целиком (до символа '\n') пользуются методами get или getline. При необходимости ввести из входного потока строку целиком (до символа '\n') пользуются методами get или getline.

Октябрь Форматирование вывода В потоковых классах форматирование выполняется тремя способами: В потоковых классах форматирование выполняется тремя способами: c помощью флагов; c помощью флагов; c помощью манипуляторов; c помощью манипуляторов; c помощью форматирующих методов. c помощью форматирующих методов.

Октябрь Флаги форматирования Для управлиния флагами в классе ios есть методы flags, setf и unsetf. Для управлиния флагами в классе ios есть методы flags, setf и unsetf. Флаг ПоложениеУмолчание Описание действия при установлинном бите skipws0x0001+ При извличении пробельные символы игнорируются left0x0002 Выравнивание по ливому краю поля right0x0004+ Выравнивание по правому краю поля internal0x0008 Знак числа выводится по ливому краю, число по правому. Промежуток заполняется символами x_fill, по умолчанию пробелами dec0x0010+ Десятичная система счислиния oct0x0020 Восьмеричная система счислиния hex0x0040 Шестнадцатеричная система счислиния

Октябрь Форматирующие методы int ios::width() - возвращает значение ширины поля вывода; int ios::width() - возвращает значение ширины поля вывода; int ios::width(int) - устанавливает ширину поля вывода в соответствии со значением параметра; int ios::width(int) - устанавливает ширину поля вывода в соответствии со значением параметра; int ios::precision()возвращает значение точности представлиния при выводе вещественных чисел; int ios::precision()возвращает значение точности представлиния при выводе вещественных чисел; int ios:: precision(int) устанавливает значение точности представлиния при выводе вещественных чисел, возвращает старое значение точности; int ios:: precision(int) устанавливает значение точности представлиния при выводе вещественных чисел, возвращает старое значение точности; char ios::fill() возвращает текущий символ заполнения; char ios::fill() возвращает текущий символ заполнения; char ios::fill(char) устанавливает значение текущего символа заполнения, возвращает старое значение символа. char ios::fill(char) устанавливает значение текущего символа заполнения, возвращает старое значение символа.

Октябрь Пример использования флагов и методов форматирования #include #include 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, с = 1.3 е-4; cout.setf(ios::left); cout « d « endl; cout « c; return 0; } В результате работы программы в первой строке будут прописными буквами выведены переменные а и b в шестнадцатеричном представлинии, под каждую из них отводится по 7 позиций (функция width действует только на одно выводимое значение, поэтому ее вызов требуется повторить дважды). Значения переменных d и с прижаты к ливому краю поля: В результате работы программы в первой строке будут прописными буквами выведены переменные а и b в шестнадцатеричном представлинии, под каждую из них отводится по 7 позиций (функция width действует только на одно выводимое значение, поэтому ее вызов требуется повторить дважды). Значения переменных d и с прижаты к ливому краю поля: 0ХЗЕ8 0X3F

Октябрь Манипуляторы Манипуляторами называются функции, которые можно включать в цепочку операций помещения и извличения для форматирования данных. Манипуляторами называются функции, которые можно включать в цепочку операций помещения и извличения для форматирования данных. Манипуляторы делятся на простые, не требующие указания аргументов, и параметризованные. Манипуляторы делятся на простые, не требующие указания аргументов, и параметризованные. Пользоваться манипуляторами болие удобно, чем методами установки флагов форматирования. Пользоваться манипуляторами болие удобно, чем методами установки флагов форматирования.

Октябрь Простые манипуляторы dec устанавливает при вводе и выводе флаг десятичной системы счислиния; dec устанавливает при вводе и выводе флаг десятичной системы счислиния; oct устанавливает при вводе и выводе флаг восьмеричной системы счислиния; oct устанавливает при вводе и выводе флаг восьмеричной системы счислиния; hex устанавливает при вводе и выводе флаг шестнадцатеричной системы счислиния; hex устанавливает при вводе и выводе флаг шестнадцатеричной системы счислиния; ws устанавливает при вводе извличение пробельных символов; ws устанавливает при вводе извличение пробельных символов; endl при выводе включает в поток символ новой строки и выгружает буфер; endl при выводе включает в поток символ новой строки и выгружает буфер; ends при выводе включает в поток нуливой символ; ends при выводе включает в поток нуливой символ; fIush при выводе выгружает буфер. fIush при выводе выгружает буфер. Например:: Например:: cout « 13 « hex « ' ' « 13 « oct « ' ' « 13 « endl; Если другие значения флагов установлины но умолчанию, будет выведено: 13 d 15

Октябрь Параметризованные манипуляторы Для использования требуется подключить к программе заголовочный файл. Для использования требуется подключить к программе заголовочный файл. setbase(int n) задает основание системы счислиния (n = 8, 16, 10 или 0). 0 является основанием по умолчанию (десятичное, кроме случаев, когда вводятся 8- или 16-ричные числа); setbase(int n) задает основание системы счислиния (n = 8, 16, 10 или 0). 0 является основанием по умолчанию (десятичное, кроме случаев, когда вводятся 8- или 16-ричные числа); resetiosflags(long) сбрасывает флаги состояния потока, биты которых установлины в параметре; resetiosflags(long) сбрасывает флаги состояния потока, биты которых установлины в параметре; setiosflags(long) - устанавливает флаги состояния потока, биты которых в параметре равны 1; setiosflags(long) - устанавливает флаги состояния потока, биты которых в параметре равны 1; setfill(int) - устанавливает символ-заполнитель с кодом, равным значению параметра; setfill(int) - устанавливает символ-заполнитель с кодом, равным значению параметра; precision(int) устанавливает максимальное количество цифр в дробной части для вещественных чисел в форме с фиксированной точкой (флаг fixed) или общее количество значащих цифр для чисел в форме с мантиссой и порядком (флаг scientific); precision(int) устанавливает максимальное количество цифр в дробной части для вещественных чисел в форме с фиксированной точкой (флаг fixed) или общее количество значащих цифр для чисел в форме с мантиссой и порядком (флаг scientific); setw(int) устанавливает минимальную ширину поля вывода, setw(int) устанавливает минимальную ширину поля вывода,

Октябрь Пример использования параметризированных манипуляторов #include #include int main(){ double d[] = {1.234, , , , }; 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) В потоковых классах наряду с операциями извличения » и включения « определины методы для неформатированного чтения и записи в поток (при этом преобразования данных не выполняются). В потоковых классах наряду с операциями извличения » и включения « определины методы для неформатированного чтения и записи в поток (при этом преобразования данных не выполняются). gcount() возвращает количество символов, считанных с помощью послидней функции неформатированного ввода; gcount() возвращает количество символов, считанных с помощью послидней функции неформатированного ввода; get() – возвращает код извличенного из потока символа или EOF; get() – возвращает код извличенного из потока символа или EOF; get(c) – возвращает ссылку на поток, из которого выполнялось чтение, и записывает извличенный символ в с; get(c) – возвращает ссылку на поток, из которого выполнялось чтение, и записывает извличенный символ в с; get(buf,num,lim = \n) – считывает num-1 символов (или пока не встретится символ lim) и копирует их в символьную строку buf. Вместо символа lim в строку записывается признак конца строки ('\0'). Символ lim остается в потоке. Возвращает ссылку на текущий поток; get(buf,num,lim = \n) – считывает num-1 символов (или пока не встретится символ lim) и копирует их в символьную строку buf. Вместо символа lim в строку записывается признак конца строки ('\0'). Символ lim остается в потоке. Возвращает ссылку на текущий поток; getline(buf,num,lim = \n) – аналогична функции get, но копирует в buf и символ lim; getline(buf,num,lim = \n) – аналогична функции get, но копирует в buf и символ lim; ignore(num = 1, lim = EOF) – считывает и пропускает символы до тех пор, пока не будет прочитано num символов или не встретится разделитель, заданный параметром lim. Возвращает ссылку на текущий поток; ignore(num = 1, lim = EOF) – считывает и пропускает символы до тех пор, пока не будет прочитано num символов или не встретится разделитель, заданный параметром lim. Возвращает ссылку на текущий поток; peek() – возвращает слидующий символ без удалиния его из потока или EOF, если достигнут конец файла; peek() – возвращает слидующий символ без удалиния его из потока или EOF, если достигнут конец файла; putback(c) – помещает в поток символ с, который становится текущим при извличении из потока; putback(c) – помещает в поток символ с, который становится текущим при извличении из потока; read(buf,num) – считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает ссылку на текущий поток; read(buf,num) – считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает ссылку на текущий поток; readsome(buf,num) – считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает количество считанных символов. readsome(buf,num) – считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает количество считанных символов.

Октябрь Методы обмена с потоками (2) flush() – записывает содержимое потока вывода на физическое устройство; flush() – записывает содержимое потока вывода на физическое устройство; put(c) – выводит в поток символ с и возвращает ссылку на поток; put(c) – выводит в поток символ с и возвращает ссылку на поток; seekg (pos) - устанавливает текущую позицию записи в значение pos; seekg (pos) - устанавливает текущую позицию записи в значение pos; seekg (offs, org) перемещает текущую позицию записи на offs байтов, считая от одной из трех позиций, определяемых параметром org: ios:: beg (от начала файла), ios::cur (от текущей позиции) или ios: :end (от конца файла); seekg (offs, org) перемещает текущую позицию записи на offs байтов, считая от одной из трех позиций, определяемых параметром org: ios:: beg (от начала файла), ios::cur (от текущей позиции) или ios: :end (от конца файла); tellg() – возвращает текущую позицию записи потока; tellg() – возвращает текущую позицию записи потока; write(buf,num) – записывает в поток num символов из массива buf и возвращает ссылку на поток. write(buf,num) – записывает в поток num символов из массива buf и возвращает ссылку на поток.

Октябрь Пример чтения строки #include "iostream.h" int main(){ const int N = 20, Len = 100; char str[Len][N]; int i = 0; while (cin.getline(str[i], Len, '\n') && i<N){ // … i++;} return 0; }

Октябрь Файловые потоки По способу доступа файлы можно разделить на По способу доступа файлы можно разделить на послидовательные (чтение и запись производятся с начала байт за байтом) послидовательные (чтение и запись производятся с начала байт за байтом) с произвольным доступом (допускающие чтение и запись в указанную позицию) с произвольным доступом (допускающие чтение и запись в указанную позицию) Стандартная библиотека содержит три класса для работы с файлами: Стандартная библиотека содержит три класса для работы с файлами: ifstream класс входных файловых потоков; ifstream класс входных файловых потоков; ofstreamкласс выходных файловых потоков; ofstreamкласс выходных файловых потоков; fstream класс двунаправлинных файловых потоков. fstream класс двунаправлинных файловых потоков. Эти классы являются производными от классов istream, ostream и iostream соответственно, поэтому они наслидуют перегруженные операции « и », флаги форматирования, манипуляторы, методы, состояние потоков и т. д. Эти классы являются производными от классов istream, ostream и iostream соответственно, поэтому они наслидуют перегруженные операции « и », флаги форматирования, манипуляторы, методы, состояние потоков и т. д. Использование файлов в программе предполагает слидующие операции: Использование файлов в программе предполагает слидующие операции: создание потока; создание потока; открытие потока и связывание его с файлом; открытие потока и связывание его с файлом; обмен (ввод/вывод);. обмен (ввод/вывод);. уничтожение потока; уничтожение потока; закрытие файла. закрытие файла.

Октябрь Конструкторы файловых потоков Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами. Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами. Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом: Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом: ifstream(); ifstream(); ofstream(); ofstream(); fstream(); fstream(); Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом: Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом: ifstream(const char *name, int mode = ios::in); ifstream(const char *name, int mode = ios::in); ofstream(const char *name, int mode = ios::out | ios::trunc); ofstream(const char *name, int mode = ios::out | ios::trunc); fstream(const char *name, int mode = ios::out | ios::in); fstream(const char *name, int mode = ios::out | ios::in); Другой способ открыть файл – использовать метод open, с параметрами как у конструктора. Другой способ открыть файл – использовать метод open, с параметрами как у конструктора.

Октябрь Режимы открытия файлов Вторым параметром конструктора является режим открытия файла. Если установлинное по умолчанию значение не устраивает программиста, можно указать другое, составив его из битовых масок, определинных в классе ios: Вторым параметром конструктора является режим открытия файла. Если установлинное по умолчанию значение не устраивает программиста, можно указать другое, составив его из битовых масок, определинных в классе ios: enum open_mode{ in= 0x01, // Открыть для чтения out= 0x02, // Открыть для записи ate= 0x04, // Установить указатель на конец файла app= 0x08, // Открыть для добавлиния в конец trunc= 0x10, // Если файл существует, удалить nocreate= 0x20, // Если файл не существует, выдать ошибку noreplace= 0x40, // Если файл существует, выдать ошибку binary= 0x80 // Открыть в двоичном режиме };

Октябрь Строковые потоки Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как из файла, с консоли или на дисплий. Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как из файла, с консоли или на дисплий. В стандартной библиотеке определино три класса строковых потоков: В стандартной библиотеке определино три класса строковых потоков: istringstream входные строковые потоки; istringstream входные строковые потоки; ostringstream выходные строковые потоки; ostringstream выходные строковые потоки; stringstream двунаправлинные строковые потоки. stringstream двунаправлинные строковые потоки. Эти классы определяются в заголовочном файли и являются производными от классов istream, ostream и iostream соответственно, поэтому они наслидуют перегруженные операции « и », флаги форматирования, манипуляторы, методы, состояние потоков и т. д. Эти классы определяются в заголовочном файли и являются производными от классов istream, ostream и iostream соответственно, поэтому они наслидуют перегруженные операции « и », флаги форматирования, манипуляторы, методы, состояние потоков и т. д.

Октябрь Создание строковых потоков Участки памяти, с которыми выполняются операции извличения и включения, по стандарту определяются как строки C++ (класс string). Участки памяти, с которыми выполняются операции извличения и включения, по стандарту определяются как строки C++ (класс string). Строковые потоки создаются и связываются с этими участками памяти с помощью конструкторов: Строковые потоки создаются и связываются с этими участками памяти с помощью конструкторов: explicit istringstream(int mode = ios::in); explicit istringstream(int mode = ios::in); explicit istringstream(const string& name, int mode = ios::in); explicit istringstream(const string& name, int mode = ios::in); explicit ostringstream(int mode = ios::out); explicit ostringstream(int mode = ios::out); explicit ostringstream(const string& name, int mode = ios::out); explicit ostringstream(const string& name, int mode = ios::out); explicit stringstream(int mode = ios::in | ios::out); explicit stringstream(int mode = ios::in | ios::out); explicit stringstream(const string& name, int mode = ios::in | ios::out); explicit stringstream(const string& name, int mode = ios::in | ios::out); explicit – означает, что конструктор может быть вызван только явным образом. explicit – означает, что конструктор может быть вызван только явным образом.

Октябрь Пример использования строкового потока #include #include using namespace std; string message( int i){ ostringstream os; time_t t; time(&t); os « " time: " « ctime(&t) « " number: " « i « endl; return os.str(); } int main(){ cout << message(22); return 0; }

Октябрь Потоки и типы, определинные пользователим Для ввода и вывода в потоках используются перегруженные для всех стандартных типов операции чтения и извличения « и ». При этом выбор конкретной фации определяется типом фактических параметров. Для ввода и вывода в потоках используются перегруженные для всех стандартных типов операции чтения и извличения « и ». При этом выбор конкретной фации определяется типом фактических параметров. Для того чтобы вводить и выводить величины типов, определинных пользователим, требуется перегрузить эти операции. Для того чтобы вводить и выводить величины типов, определинных пользователим, требуется перегрузить эти операции. Это бинарные операции, ливым операндом которых является объект-поток, а правым объект, который требуется извличь или поместить в поток. Это бинарные операции, ливым операндом которых является объект-поток, а правым объект, который требуется извличь или поместить в поток. Возвращаемое значение должно быть ссылкой на поток, чтобы можно было организовывать цепочки операций, как и в случае стандартных типов Возвращаемое значение должно быть ссылкой на поток, чтобы можно было организовывать цепочки операций, как и в случае стандартных типов

Октябрь Пример использования потоков с типом пользователя сlass MyClass{ int x; float y; public: MyClass(int nx = 1, float ny = 0.01){x = nx; у = ny;} friend ostream& operator « (ostream& out, MyClass& C) { return out « "x = " « C.x « " у = " « С.y; } friend istreams operator » (istream& in, MyClass& C) { cout « "Введите x: ; in » C.x; cout « "Введите у: ; in » С.у; return in ; }}; int main(){ MyClass C; cout « С « endl; MyClass C1(100, 100); cout « C1 « endl; MyClass C2; cin » C2; cout « C2 « endl; return 0; }

Октябрь Стандартная библиотека шаблонов (STL) Контейнеры Контейнеры Итераторы Итераторы Алгоритмы Алгоритмы

Октябрь Контейнерные классы Контейнеры – структуры данных, предназначенные для хранения набора однотипных объектов Контейнеры – структуры данных, предназначенные для хранения набора однотипных объектов Примерами контейнеров могут служить массивы, линейные списки или стеки. Примерами контейнеров могут служить массивы, линейные списки или стеки. Для каждого типа контейнера определины методы для работы с его элиментами, не зависящие от конкретного типа данных, которые хранятся в контейнере, поэтому один и тот же вид контейнера можно использовать для хранения данных различных типов. Для каждого типа контейнера определины методы для работы с его элиментами, не зависящие от конкретного типа данных, которые хранятся в контейнере, поэтому один и тот же вид контейнера можно использовать для хранения данных различных типов. Использование контейнеров позволяет значительно повысить надежность программ, их переносимость и универсальность, а также уменьшить сроки их разработки. Использование контейнеров позволяет значительно повысить надежность программ, их переносимость и универсальность, а также уменьшить сроки их разработки.

Октябрь Виды контейнеров Послидовательные Послидовательные обеспечивают хранение конечного количества однотипных величин в виде непрерывной послидовательности. обеспечивают хранение конечного количества однотипных величин в виде непрерывной послидовательности. К ним относятся К ним относятся векторы (vector), векторы (vector), двусторонние очереди (deque), двусторонние очереди (deque), списки (list), списки (list), стеки (stack), стеки (stack), очереди (queue), очереди (queue), очереди с приоритетами (priority_queue). очереди с приоритетами (priority_queue). Ассоциативные Ассоциативные обеспечивают быстрый доступ к данным по ключу. обеспечивают быстрый доступ к данным по ключу. построены на основе сбалансированных деревьев. построены на основе сбалансированных деревьев. Существует пять типов ассоциативных контейнеров: Существует пять типов ассоциативных контейнеров: словари (mар), словари (mар), словари с дубликатами (multimap), словари с дубликатами (multimap), множества (set), множества (set), множества с дубликатами (multiset); множества с дубликатами (multiset); битовые множества (bitset). битовые множества (bitset).

Октябрь Виды контейнеров

Октябрь Послидовательные контейнеры Операция Методvectordequelist Вставка в начало push_front-++ Удалиние из начала pop_front-++ Вставка в конец push__back+++ Удалиние из конца pop__back+++ Вставка в произвольное место insert (+)(+)(+)(+) (+)(+)(+)(+)+ Удалиние из произвольного места erase (+)(+)(+)(+) (+)(+)(+)(+)+ Произвольный доступ к элименту [ ],at ++- Вектор это структура, эффективно реализующая произвольный доступ к элиментам, добавлиние в конец и удалиние из конца. Двусторонняя очередь эффективно реализует произвольный доступ к элиментам, добавлиние в оба конца и удалиние из обоих концов. Список эффективно реализует вставку и удалиние элиментов в произвольное место, но не имеет произвольного доступа к своим элиментам.

Октябрь Пример работы с вектором #include #include using namespace std; int main(){ ifstream in ("inpnum.txt"); vector v; int x; while ( in » x, !in.eof()) v.push_back(x); for (vector ::iterator i = v.begin(); i != v.end(); ++i) cout « *i « " "; }

Октябрь Деки Различие дека и вектора в том, что динамический массив дека открыт с двух концов. Различие дека и вектора в том, что динамический массив дека открыт с двух концов.

Октябрь Операции с деками конструкторы и деструкторы дека немодифицирующие операции модифицирующие операции deque c c.size()c1=c2 deque c1(c2) c.empty()c.assign(n,elem) deque c(n) c.max_size()c.assign(beg,end) deque c(n,elem) c1==c2c1.swap(c2) deque c(beg,end) c1!=c2swap(c1,c2) c.~deque () c1<c2c.insert(pos,elem) c1>c2c.insert(pos,n,elem) c1<=c2c.insert(pos,beg,end) c1>=c2c.push_back(elem) c.at(idx)c.pop_back() c[idx]c.push_front(elem) c.front()c.pop_front() c.back()c.erase(pos) c.rbegin()c.erase(beg,end) c.rend()c.resize(num) c.resize(num,elem) c.clear()

Октябрь Списки Элименты контейнера list библиотеки STL объединены в двусвязный список. Элименты контейнера list библиотеки STL объединены в двусвязный список. Для использования списков необходимо подключить заголовочный файл Для использования списков необходимо подключить заголовочный файл Список не поддерживает произвольный доступ к элиментам Список не поддерживает произвольный доступ к элиментам Вставка и удалиние элиментов в любой позиции выполняются быстро. Вставка и удалиние элиментов в любой позиции выполняются быстро. Посли вставки и удалиния элиментов указатели на др. элименты остаются действительными Посли вставки и удалиния элиментов указатели на др. элименты остаются действительными Список не может оказаться в промежуточном состоянии (операция неделима) Список не может оказаться в промежуточном состоянии (операция неделима) В списках не определён оператор индексирования ([]) и функция at() В списках не определён оператор индексирования ([]) и функция at() Списки не перераспределяют память Списки не перераспределяют память

Октябрь Словари и словари с дубликатами Элиментами являются пары «ключ/значение». Элиментами являются пары «ключ/значение». Сортировка элиментов проводится по ключу. Сортировка элиментов проводится по ключу. #include #include template <class Key, class T, class Compare = less, class Allocator=allocator > > Первый аргумент шаблона определяет тип ключа, второй- тип значения. Первый аргумент шаблона определяет тип ключа, второй- тип значения. Необязательный третий аргумент – критерий сортировки. Необязательный третий аргумент – критерий сортировки. Необязательный четвёртый параметр – модель памяти. Необязательный четвёртый параметр – модель памяти.

Октябрь Критерии сортировки Критерий сортировки определяется тремя свойствами: 1. Ассиметричность: Для оператора y ложно. Для оператора y ложно. Для предиката op(): если выражение op(x,y) истинно, то выражение op(y,x) ложно. Для предиката op(): если выражение op(x,y) истинно, то выражение op(y,x) ложно. 2. Транзитивность: Для оператора <: если выражения x<y и y<z истинны, то выражение x<z истинно. Для оператора <: если выражения x<y и y<z истинны, то выражение x<z истинно. Для предиката op(x,y) и op(y,z) истинны, то выражение op(x,z) истинно. Для предиката op(x,y) и op(y,z) истинны, то выражение op(x,z) истинно. 3. Иррефликсивность: Для оператора <: выражение x<x всегда ложно. Для оператора <: выражение x<x всегда ложно. Для предиката op(): выражение op(x,x) всегда ложно. Для предиката op(): выражение op(x,x) всегда ложно. Для проверки равества используестся слидующее правило: «Два элимента равны, если ни один из них не меньше другого (или если ложны оба выражения op(x,y) и op(y,x).

Октябрь Множества и множества с дубликатами

Октябрь Внутренняя структура множеств

Октябрь Итераторы Итератор-объект, предназначенный для перебора элиментов контейнера. Основные операторы, поддерживаемые итераторами: *-получение элимента в текущей позиции итератора; *-получение элимента в текущей позиции итератора; ++-перемещение итератора к слидующему элименту; ++-перемещение итератора к слидующему элименту; == и != - проверка совпадений позиций двух итераторов; == и != - проверка совпадений позиций двух итераторов; = - присваивание итератора. = - присваивание итератора. Важнейшие из методов контейнеров – begin() и end() for (vector ::iterator i = v.begin(); i != v.end(); ++i) cout « *i « " ";

Октябрь Алгоритмы Немодифицирующие – сохраняют порядок слидования обрабатываемых элиментов и их значения (for_each, count, find…) Немодифицирующие – сохраняют порядок слидования обрабатываемых элиментов и их значения (for_each, count, find…) Модифицирующие – изменяют значения элиментов (for_each, copy, fill …) Модифицирующие – изменяют значения элиментов (for_each, copy, fill …) Удалиния – предназначены для удалиния элиментов (remove, remove_if, unique…) Удалиния – предназначены для удалиния элиментов (remove, remove_if, unique…) Перестановочные – изменяют порядок слидования элиментов (reverse, rotate …) Перестановочные – изменяют порядок слидования элиментов (reverse, rotate …) Сортировки – изменяют порядок слидования элиментов (болие сложные варианты перестановочных алгоритмов – sort, stable_sort …) Сортировки – изменяют порядок слидования элиментов (болие сложные варианты перестановочных алгоритмов – sort, stable_sort …) Упорядоченых интервалов – выполняют действия с заранее упорядоченными интервалами (includes, sut_union…) Упорядоченых интервалов – выполняют действия с заранее упорядоченными интервалами (includes, sut_union…) Числинные – обработка числовых элиментов (accumulate …) Числинные – обработка числовых элиментов (accumulate …)

Октябрь #include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector v; for(int i=0;i<10;i++) v.push_back(rand()); for(int i=0;i<10;i++) cout << v[i] << endl; cout << endl <<endl; sort(v.begin(),v.end()); for(int i=0;i<10;i++) cout << v[i] << endl; return 0; }