Разработка программного модуля для компьютерной игры

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?ривести к непредсказуемым последствиям.

string - формально можно рассматривать как частный случай контейнера vector, содержащего символы. Использовать string гораздо удобней, чем пользоваться строками в стиле C. Для string определены такие операции, как конкатенация (iепление), преобразование к традиционной C-строке, присваивание, сравнение и ряд других.

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

Итераторы

Итератор (iterator) - специализированный объект, предназначенный для доступа к элементам последовательностей, в частности к элементам контейнеров. По своему поведению итератор напоминает указатель на элемент данных: к нему можно применить оператор разыменования * или оператор выбора члена класса через указатель ->.

Рис. 2.8. Иерархия итераторов в STL

Иерархия итераторов STL представлена на рис. 2.8. Это не диаграмма наследования классов. Категория итераторов - это характеристика типа, основанная на том, какие операции он обеспечивает. Существует известная идиома на этот счет: всё, что ведет себя как итератор, является итератором.

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

Среди контейнеров, vector и string поддерживают итераторы со случайным доступом. Обычный указатель C++ в большинстве случаев может играть роль итератора со случайным доступом, но пользоваться этим категорически не рекомендуется.

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, также называются объектами-функциями) - объект любого класса, для которого определён оператор вызова функции (). Следуя определению, любая функция является функтором.

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

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

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

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

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

2.2.4 Потоки

В языке C++ отсутствуют встроенные средства ввода/вывода. Они предоставляются программисту различными библиотеками, в том числе STL. В STL реализован гибк