
- •Раздел 1. Специальный раздел
- •1.1. Исследовательская часть
- •1.1.1. Постановка задачи
- •1.1.2. Предварительные нир
- •1.3. Информационные потребности пользователя
- •1.1.4. Требования, предъявляемые системе
- •1.2. Конструкторская часть
- •1.2.1. Структура входных и выходных данных
- •1.2.2. Общая схема работы модуля
- •1.2.3. Выбор платформы проектирования и его обоснование
- •1.2.4. Проектирование архитектуры модуля
- •1.2.5. Конфигурация технических средств
- •1.2.6. Алгоритмы работы модуля
- •1.2.7. Методика тестирования
- •1.2.8. Результаты экспериментальной проверки
- •2.1. Проектирование на языке uml
- •2.1.1. Концепция Unified Modeling Language
- •2.1.2. Виды диаграмм uml
- •2.1.3. Связь с объектно-ориентированными языками
- •2.2. Идеология stl в применении к архитектуре модуля
- •2.2.2. Контейнеры stl
- •2.2.3. Алгоритмы stl
- •2.2.4. Потоки
- •2.4.1. Умные указатели
- •2.3. Специализированный инструментарий
- •2.4.2. Типы тестов
- •2.4.3. Планирование модульных тестов
- •2.4.4. Примеры тестирования
- •2.4.5. Методы “грубой силы” и их применение при отладке программы
- •3.1. Цели определения себестоимости и цены модуля
- •3.2. Методы определения себестоимости
- •3.3. Расчет себестоимости vfs
- •3.4. Методы расчета цены
- •3.4.1. Расчет цены по стоимости изготовления
- •3.4.2. Расчет цены на основе роялти
- •3.4.3. Расчет цены на тиражируемый продукт
- •3.5. Расчет цены vfs
- •3.6. Выводы
- •4.2.1. Психофизиологические факторы
- •4.2.2. Электромагнитные излучения
- •4.2.3. Освещение рабочего места
- •4.2.4 Электробезопасность
- •4.2.5 Микроклимат
- •4.2.6. Зашумленность
- •4.3. Инженерный расчет освещенности машинного зала
- •4.4. Экологическая безопасность
- •4.5. Пожарная безопасность
- •4.6. Выводы
- •Список литературы
Какую работу нужно написать?
2.2.2. Контейнеры stl
Контейнеры STL– это шаблонные классы, которые предназначены для хранения ряда однотипных объектов. К объектам, хранимым в контейнере, предъявляются следующие требования:
1) доступный конструктор копирования;
2) доступный оператор присваивания;
3) доступный деструктор.
Все контейнеры поддерживают базовый функционал:
1) набор конструкторов; среди них: конструктор по умолчанию, конструктор копирования, конструктор, заполняющий контейнер элементами из последовательности и ряд других;
2) деструктор; при уничтожении контейнера вызываются деструкторы всех содержащихся в нём объектов, а всё память освобождается;
3) функции begin(),end(),rbegin(),rend() – возвращают итераторы на начало и конец последовательности объектов, содержащихся в контейнере, в прямом и, соответственно, обратном порядке; как и всюду вSTL, итератор на начало указывает на первый элемент последовательности, а итератор на конец – на место в памяти за последним;
4) функция size(), возвращающая количество элементов в контейнере.
В разработке VFSконтейнеры применялись как основной способ хранения данных. Все предоставляемые интерфейсом модуля последовательности объектов являются контейнерамиSTL. Ниже перечислены основные использовавшиеся контейнеры.
vector– контейнер, являющийся динамическим массивом. Используется для организации редко редактируемых списков. Контейнерvectorэффективно реализует следующие операции:
1) добавление и удаление элементов в конце массива;
2) доступ к элементу с произвольным номером;
3) возможность интерпретировать список элементов как традиционный массив C.
При этом добавление или удаление элемента в середине может привести к значительным накладным расходам: поскольку стандарт С++ требует, чтобы данные вектора были размещены в памяти непрерывно (как массив С), операции с серединой контейнера вызовут переаллокацию памяти.
Доступ к элементам контейнера реализуется с помощью random-accessитераторов и оператора [] (аналогично массивам С).
list– контейнер, являющийся двунаправленным связным списком. Его главная отличительная особенность – возможность быстрого добавления и удаления узлов в любом месте списка, при этом местоположение в памяти всех прочих элементов не изменяется.
Список целесообразно применять в случаях, когда требуются многочисленные операции вставки и удаления в середине контейнера, и нет необходимости в доступе по индексу. Этот контейнер поддерживает очень быстрые операции слияния и разделения списков (физического копирования элементов при этом не происходит, модифицируются только указатели в управляющих структурах).
set, multiset, map, multimap– ассоциативные контейнеры, предназначенные для хранения упорядоченных последовательностей элементов с возможностью быстрой вставки и удаления.
По затратам памяти и отношению к указателям ассоциативные контейнеры похожи на list(в большинстве реализаций для представления этих контейнеров используются бинарные деревья). Не стоит использовать эти контейнеры, если в этом нет необходимости.
Контейнеры с приставкой multi- допускают повторяющиеся элеметы, без приставки – нет. При этомsetтребует, чтобы были упорядочены сами хранимые элементы, аmapхранит пары ключ-значение (mapиспользует простой вспомогательный шаблонpairдля хранения этих пар). Следует учесть, что ассоциативные контейнеры не допускают изменение ключей после добавления элементов. Это правило можно обойти, но это может привести к непредсказуемым последствиям.
string– формально можно рассматривать как частный случай контейнераvector, содержащего символы. Использоватьstringгораздо удобней, чем пользоваться строками в стилеC. Дляstringопределены такие операции, как конкатенация (сцепление), преобразование к традиционнойC-строке, присваивание, сравнение и ряд других.
Кроме того, stringявляется контейнером, а значит к нему применим весь набор стандартных алгоритмовSTL.
Итераторы
Итератор (iterator) – специализированный объект, предназначенный для доступа к элементам последовательностей, в частности к элементам контейнеров. По своему поведению итератор напоминает указатель на элемент данных: к нему можно применить оператор разыменования «*» или оператор выбора члена класса через указатель «->».
Рис. 2.8. Иерархия итераторов в STL
Иерархия итераторов STLпредставлена на рис. 2.8. Это не диаграмма наследования классов. Категория итераторов – это характеристика типа, основанная на том, какие операции он обеспечивает. Существует известная идиома на этот счет: «всё, что ведет себя как итератор, является итератором».
Итератор ввода позволяет только считывать значения и поддерживает операцию инкрементации «++». Итератор вывода позволяет только записывать значения и поддерживает операцию инкрементации «++». Однонаправленный итератор является итератором ввода и вывода одновременно. Итераторы этих трёх типов в основном применяются потоками ввода вывода и стандартными шаблонными алгоритмами. Двунаправленный итератор подобен однонаправленному, но кроме операции инкрементации поддерживает ещё и операцию декремента «--». Все контейнеры поддерживают двунаправленные итераторы. Итератор со случайным доступом поддерживает операции сдвига на целое число элементов и, подобно обычному указателю C++, разыменование с помощью оператора индексации. Кроме того, можно вычесть один итератор с произвольным доступом из другого и узнать, сколько элементов их разделяет.
Среди контейнеров, vectorиstringподдерживают итераторы со случайным доступом. Обычный указательC++ в большинстве случаев может играть роль итератора со случайным доступом, но пользоваться этим категорически не рекомендуется.