Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

20.Коллекции

20.1.Обзор коллекций mfc

(См. раздел MSDN «Collections topics»)

Библиотека MFC предоставляет коллекцию классов для манипулирования (обработки) групп объектов различных типов. Эти классы подразделяются на две основные группы по признаку происхождения:

  • коллекции классов, созданные на основе шаблонов;

  • коллекции классов, построенные не на шаблонах.

Любой класс коллекция характеризуется своей «формой» (shape) и типом элементов. Под формой класса понимается способ организации и хранения элементов коллекции. MFC предоставляет три основные формы коллекций:

  • списки (lists);

  • массивы (arrays);

  • ассоциативные массивы (maps), называемые иногда словарями (dictionaries).

Вы можете выбирать наиболее подходящую форму коллекции для решения своей конкретной задачи. Кратко эти формы коллекций можно описать так.

Списки. Классы списков предоставляют упорядоченную, неиндексированную совокупность элементов, реализованную в форме двусвязного списка. Список имеет «голову» (head) и «хвост» (tail) и добавление или удаление элементов с головы или хвоста, равно как и вставка или удаление элементов из середины могут быть выполнены очень быстро.

Массивы. Эти классы обеспечивают индексированную, упорядоченную совокупность элементов, число элементов которой можно динамически изменять.

Ассоциативные массивы. Эти массивы представляют собой совокупность пар элементов: ключ и значение. Другими словами, элементы такого массива индексируются уникальными ключами.

Основанные на шаблонах коллекции.

Использование какого-либо класса MFC, построенного на основе шаблона, представляет собой простейший и типо-безопасный (type-safe) способ манипулирования объектами любого типа. Основанные на шаблонах коллекции приведены в табл. 1.

Таблица 1.

Шаблонные классы коллекций

Тип элементов коллекции

Массивы

Списки

Ассоциативные массивы

Произвольный

CArray

CList

CMap

Указатель на объект любого типа

CTypedPtrArray

CTypedPtrList

CTypedPtrMap

Нешаблонные классы коллекций.

Эти коллекции (табл. 2) считаются устаревшими и их не рекомендуется использовать в новых разработках.

Таблица 2.

Нешаблонные классы коллекций

Массивы

Списки

Ассоциативные массивы

CObArray

CObList

CMapPtrToWord

CByteArray

CPtrList

CMapPtrToPtr

CDWordArray

CStringList

CMapStringToOb

CPtrArray

 

CMapStringToPtr

CStringArray

 

CMapStringToString

CWordArray

 

CMapWordToOb

CUIntArray

 

CMapWordToPtr

Выбор коллекции.

При выборе формы коллекции надо учитывать следующие факторы:

  • свойства коллекции: упорядоченность, индексирование, эффективность;

  • основан ли класс на шаблоне;

  • имеет ли коллекция встроенную функцию сериализации Serialize();

  • имеет ли коллекция встроенную функцию Dump() (вывода для отладки);

  • является ли коллекция типо-безопасной.

В табл.3 приведены свойства классов коллекций. Во втором и третьем столбцах таблицы приведен признак упорядоченности элементов коллекций и возможность индексирования. Термин «упорядоченность» не означает, что элементы коллекции отсортированы; он означает только то, что порядок размещения элементов коллекции соответствует порядку их добавления или вставки. Термин «индексированность» означает возможность получения доступа к элементам коллекции по целочисленному индексу (с нуля), как в обычном массиве.

Столбцы 4 и 5 характеризуют эффективность использования коллекции. В тех задачах, для которых характерны многочисленные операции вставки элементов в коллекции, скорость вставки является определяющим фактором, в то время как для других задач скрорость поиска более важна.

Наконец, в шестом столбце указано, могут ли встречаться в коллекции элементы с одинаковыми значениями.

Таблица 3.

Свойства коллекций

Вид

коллекции

Упорядоченность

Индексируемость

Вставка элемента

Поиск элемента

Наличие одинаковых

элементов

Список

Да

Нет

Быстрая

Медленная

Да

Массив

Да

Целым числом

Медленная

Медленная

Да

Ассоциатив-ный массив

Нет

По ключу

Быстрая

Быстрая

Нет (ключ) Да (знач.)

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

Таблица 3.

Свойства коллекций

Класс

Шаблонный

Сериализация

Дампинг

Типо-безопасность

CArray

Да

Да 1

Да 1

Нет

CByteArray

Нет

Да

Да

Да 3

CDWordArray

Нет

Да

Да

Да 3

CList

Да

Да 1

Да 1

Нет

CMap

Да

Да 1

Да 1

Нет

CMapPtrToPtr

Нет

Нет

Да

Нет

CMapPtrToWord

Нет

Нет

Да

Нет

CMapStringToOb

Нет

Да

Да

Нет

CMapStringToPtr

Нет

Нет

Да

Нет

CMapStringToString

Нет

Да

Да

Да 3

CMapWordToOb

Нет

Да

Да

Нет

CMapWordToPtr

Нет

Нет

Да

Нет

CObArray

Нет

Да

Да

Нет

CObList

Нет

Да

Да

Нет

CPtrArray

Нет

Нет

Да

Нет

CPtrList

Нет

Нет

Да

Нет

CStringArray

Нет

Да

Да

Да 3

CStringList

Нет

Да

Да

Да 3

CTypedPtrArray

Да

Да/Нет 2

Да

Да

CTypedPtrList

Да

Да/Нет 2

Да

Да

CTypedPtrMap

Да

Да/Нет 2

Да

Да

CUIntArray

Нет

Нет

Да

Да 3

CWordArray

Нет

Да

Да

Да 3

Примечания к табл.

  1. Для сериализации достаточно просто вызвать функцию Serialize() для элемента коллекции, а для дампига – функцию Dump(). Вы не можете просто использовать оператор ar << collObj; для сериализации или оператор dс << collObj; для дампинга.

  2. Наличие или отсутствие сериализации зависит от типа элементов коллекции. Например, если типизированный массив указателей основан на CObArray, то он сериализуем; если он основан на CPtrArray – то нет. Как правило, классы с “Ptr” не сериализуемы.

  3. Если в этом столбце указано «Да», то нешаблонный класс коллекции является типо-безопасным, если используется по прямому назначению. Например, если Вы сохраняете байты в CByteArray, то массив является типо-безопасным. Однако, если тот же массив Вы используете для хранения символов, его типо-безопасность сомнительна.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]