Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Лекция 11

Методы используются для восстановление записанных в файл данных, данные при этом должны быть записаны при помощи метода write(). Объект типа string не содержит в себе строчку, а содержит адрес, поэтому при копировании структуры содержащей адрес, будут скопированы не данные ее строки, а адрес области ее хранения, что при повторном запуске теряет смысл. Произвольный доступ random access означает возможность произвольное перемещиение в любую позицию файла, что реализуется поддержкой двух указателей, считывание и записи

Класс fsream наследует два буфера (ввода/вывода) и синхронизирует управление этими двумя буферами, как только программа считывает или записывает данные , она должна перемещать указатель ввода или вывода. Для этого в классе fstream используется 2 метода перемещения по файлу

1) seekg - предназначен для перемещение в заданную позицию файла указателя ввода

2) Seekp - перемещения указателя вывода

Поскольку класс fstream использует буфер для промежуточного хранения данных , то эти указатели перемешаются не. В файле , а в буфер.КЛасс ifstream поддерживает использование метода seekg, класса ofstream поддерживает метода seekp.

Реализация метода seekg двумя аргументами , от указанной позиции позиция смещения задается аргументом seekdir, которое представляет собой целочисленный тип.

Реализация seekg с одним аргументом предназначена для перемещение на определенную позицию заданная параметром от начала файла. Для проверки текущей позиции файлового указателя можно пользоваться методом tellg для входных поток и tellp для выходных.При окончании считывании данных из файла, устанавливается flag end of File bit( eofbit ) Говорящий ,что любые дальнейшие операции чтения записи невозможно , поэтому используем метод clear.

Тема 5. Библиотека шаблонов Standart Template Library (stl)

Библиотека stl содержит набор шаблонов, итераторов, алгоритмов, и объекты функций.

Контейнер представляет собой структуру данных похожую на массив , которая хранит множество значений одного типа или ковариантного типов.

Контейнеры STL однородны по структуре и предназначены для разных способов хранения набора объекта.

Алгоритмы – это функции, используемые для решения определенных задач (сортировки, поиска, выборки элементов).

Итераторы – это объекты, позволяющие перемещаться внутри контейнера, подобно тому, как указатели перемещаются по массиву. Итераторы являются обобщениями указателей.

Объекты функций – это объекты, которые ведут себя подобно функциям и могут быть представлены объектами класса или указателями на функцию.

Библиотека STL позволяет создавать различные типы контейнеров, включая массивы, очереди, списки, отображения и осуществлять надо ними операции поиска, сортировки, тасования элементов. STL не является примером ООП программирования. В ней используется другая идеология – обобщенное программирование.

Шаблонный класс Vector

Вектор – это набор однотипных элементов, к которым можно обращаться в свободном порядке с помощью индексации, без необходимости считывания всех элементов. Можно создавать объект типа Vector, присваивать объект типа Vector другому и применять операцию индексации для доступа к отдельным элементам.

Класс Vector шаблонный, поэтому придется создать необходимый тип элементов. Вектор используется для динамического выделения памяти, и для указания количества элементов, которые могут в нем храниться.

Перегрузка оператора [] позволяет обращаться к элементам вектора, используя нотацию массива. Шаблоны контейнеров STL принимают необязательный аргумент, указывающий, какой объект-распределитель будет использоваться для управления динамической памятью. Если опустить значение объекта-распределителя, то шаблон контейнера по умолчанию, то получит класс allocator<Type>. Соответственно, этот класс будет использовать для выделения и освобождения памяти операторы new и delete.

Все контейнеры STL предоставляют набор базовых методов:

  • size() возвращает количество элементов

  • swap() обменивает содержимое 2 контейнеров

  • begin()

  • end() возвращает итератор, который представляет доступ на элемент за последовательностью

Итератор может быть представлен как указателем или объектом, для которого определены операции над указателем. Обобщение указателей позволяет STL предоставить однотипный интерфейс для множества классов-контейнеров, а в каждом классе-контейнере реализовать специфические черты итератора.

Особым методом в контейнере vector является метод push_back(). При выполнении этого метода происходит дополнительное выделение памяти и размер стека увеличивается так, чтобы в него поместились все добавляемые элементы.

Метод erase() удаляет указанный диапазон элементов вектора или элемент на определенной позиции в нем. В качестве аргументов он может принимать 2 итератора, которые определяют границы (конец не вкл). При передаче 1 аргумента – это номер элемента, который будет удален.

Метод insert() вставляет элемент, ряд или диапазон элементов в вектор в заданном положении. В качестве аргументов метод insert() может принимать 3 итератора. Первый – позиция, куда будут добавляться элементы. Второй и третий – добавляемый диапазон. Обычно этот диапазон является частью другого контейнера. Параметр count указывает, сколько раз надо добавлять элементы.

Класс вектор не содержит методов сортировки и поиска. Для реализации в STL используется дополнительный подход, заключающийся в определении автономных, не являющихся элементами какого-либо класса, функций для выполнения такого рода операций. Вместо того, чтобы определять отдельный метод find для каждого класса-контейнера в STL определяется одна автономная функция find, которую можно использовать для всех типов контейнеров. Такой подход позволяет уменьшить дублирование функций. Но ряд контейнеров библиотеки STL при наличии собственной функции предлагает собственный метод (иногда они эффективнее).

28 апр 2021