Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом_Frozen / пояснительная записка / пояснительная записка.doc
Скачиваний:
45
Добавлен:
16.04.2013
Размер:
4.04 Mб
Скачать

2.2.3. Алгоритмы stl

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

Синтаксически алгоритмы STLоформлены как шаблонные функции, шаблонными параметрами которых являются типы итераторов. Фактически, большинство алгоритмов призвано избавить программиста от написания большого количества циклов с проходами по контейнерам.

Ниже приведены некоторые особенно популярные алгоритмы STL, которые я использовал при разработкеVFS.

copy– осуществляет копирование из последовательности, заданной итераторами [First;Last) (используются стандартное математические обозначение полуоткрытого интервала), в последовательность, начинающуюся итераторомDest. Возвращает итератор на элемент, следующий за последним скопированным элементом.

fill– заполняет диапазон [First;Last) значениемVal. Все контейнеры имеют специальный конструктор с аналогичным функционалом.

find – ищет в диапазоне [First;Last) значениеVal. Возвращает итератор на первое встретившееся значение. Если значение не найдено, возвращает итераторLast. У этого алгоритма есть мощные расширения, использующие поиск в подпоследовательностях.

for_each– для каждого элемента из диапазона [First;Last), вызывает функтор, передавая ему в качестве параметра текущий элемент (полученным разыменовыванием итератора).

replace– заменяет в диапазоне [First;Last) все элементы, для которых унарный предикат истинен, значениемVal.

sort– осуществляет сортировку элементов в диапазоне [First;Last). Передаваемый бинарный предикат имеет смысл оператора сравнения «<». В случае, если сортируемые объекты поддерживают сравнение с использованием оператора «<», можно воспользоваться упрощённой формой.

Применительно к использованию контейнеров нужно упомянуть такие мощные средства, как функторы и предикаты.

Функтор(functor, также называются объектами-функциями) – объект любого класса, для которого определён оператор вызова функции «()». Следуя определению, любая функция является функтором.

Перегрузка оператора «()» в классе позволяет одновременно решить две задачи:

1) сохранить простую и интуитивно понятную концепцию вызова функции; это особенно важно при использовании шаблонов функций, например из числа стандартных алгоритмов STL;

2) предоставить функции накапливать сведения от вызова к вызову без использования глобальной области видимости.

Предикат(predicate) – это функтор, возвращающий логическое (bool) значение. Различают унарные (принимающие один параметр) и бинарные (принимающие два однотипных параметра) предикаты.

Предикаты активно используются в STL. Практически все стандартные алгоритмы и контейнеры, сравнивающие элементы, позволяют задать произвольный предикат в качестве оператора сравнения (по умолчанию для элементов используются операторы «==» и «<», в зависимости от алгоритма).

2.2.4. Потоки

В языке C++ отсутствуют встроенные средства ввода/вывода. Они предоставляются программисту различными библиотеками, в том числеSTL. ВSTLреализован гибкий объектно-ориентированный подход, названный «потоки» (streams).

Центральным понятием библиотеки iostreamявляется поток (stream). Поток можно представить себе как источник и/или приёмник последовательности байт. Переопределяя операции записи и чтения потока («сдвиг»), можно заставить поток быть источником и/или приёмником объектов некого класса.

Примечательно, что несмотря на большую гибкость, базовый интерфейс всех потоков предельно прост: он включает в себя возможность последовательно читать байты данных (для потоков ввода istream) и последовательно записывать их (для потоков выводаostream). При этом для потоков допускается буферизованный вывод (т.е. ситуация, когда оправленные на вывод данные временно хранятся в некотором буфере). Для незамедлительной отправки данных все потоки вывода поддерживают методflush. Подобная универсальность выгодно отличает библиотекуiostreamот альтернативных решений.

Использование потоков ввода/вывода распадается на две стадии: формирование и закрытие потока и собственно ввод/вывод.

Ввод/вывод в потоки осуществляется с помощью перегруженных операторов сдвига «<<» (вывод) и «>>» (ввод). Как указывалось выше, программист имеет возможность перегрузить эти операторы для своих классов обеспечив простой и удобный способ взаимодействия их с внешним миром. При этом необходимо иметь о потоке самые общие сведения:

1) тип потока (ввода, вывода, ввода/вывода);

2) тип символов потока;

3) наличие или отсутствие буферизации;

Замечу, что упомянутые операторы осуществляют форматированный ввод/вывод. Используя такие низкоуровневые средства, как методы put,write,get,readи им подобные, можно посимвольно манипулировать потоками, но эти возможности, как правило, используются при написании высокоптимизированного кода.

В модуле VFSпотоки были использованы как одна из основных составных частей: согласно ТЗ, модуль обязан предоставлять данные любого файла как поток. Используя стандартные интерфейсы потоковSTLи их буферов, были реализованы потоки, осуществляющие архивирование/распаковку и шифрацию/дешифрацию «на лету».

Соседние файлы в папке пояснительная записка
  • #
    16.04.2013190.46 Кб30UML-диаграмма system.vsd
  • #
    16.04.2013207.87 Кб30UML-диаграмма VFS (общая).vsd
  • #
    16.04.201399.33 Кб28UseCase всей VFS.vsd
  • #
    16.04.2013106.5 Кб28Входные и выходные данные.vsd
  • #
    16.04.2013112.13 Кб29Общая схема работы модуля.vsd
  • #
  • #
    16.04.2013109.57 Кб29Схема алгоритма get_descriptor.vsd
  • #
    16.04.2013106.5 Кб29Схема алгоритма get_files.vsd
  • #
    16.04.2013100.35 Кб28Схема алгоритма mount.vsd
  • #
    16.04.201396.26 Кб29технологическая - Activity.vsd
  • #
    16.04.201379.87 Кб29технологическая - Class.vsd