Рекомендации по выбору класса коллекции
Эта статья содержит подробные сведения, которые помогут вам выбрать класс коллекции для конкретного приложения.
Выбор класса коллекции зависит от ряда факторов, включая приведенные далее.
Возможности формы класса: упорядочение, индексирование и производительность, как показано в таблице Функции форм коллекции далее в этом документе.
Использует ли класс шаблоны C++
Можно ли сериализовать элементы, хранящиеся в коллекции
Можно ли поместить эти элементы в дамп для диагностики
Является ли коллекция типобезопасной
В следующей таблице Функции форм коллекцииприведены характеристики доступных форм коллекций.
В столбцах 2 и 3 приведены характеристики упорядочения и доступа к каждой форме. В таблице термин "упорядочивается" означает, что порядок вставки и удаления элементов определяет их порядок в коллекции. Это не значит, что элементы сортируются по своему содержимому. Термин "индексируется" означает, что элементы в коллекции можно получать с помощью целочисленного индекса, как элементы в обычном массиве.
В столбцах 4 и 5 описывается производительность каждой формы. В приложениях, требующих большого количества вставок в коллекцию, особое значение может иметь скорость вставки, тогда как в других приложениях наиболее важной может оказаться скорость поиска.
В столбце 6 указывается допустимость повторяющихся элементов в форме.
Функции форм коллекции
Фигура | Занято | Индексированных | Вставка элемента | Поиск указанного элемента | Повторяющиеся элементы |
---|---|---|---|---|---|
Список (List) | Да | No | Быстро | Медл. | Да |
Массив | Да | По целому числу | Медл. | Медл. | Да |
Map | No | По ключу | Быстро | Быстро | Нет (ключи) Да (значения) |
В следующей таблице Характеристики классов коллекций MFCпредставлены другие важные характеристики определенных классов коллекций MFC. Их можно использовать в качестве руководства по выбору. Выбор зависит от следующих факторов: основан ли класс на шаблонах C++, могут ли его элементы быть сериализованы посредством механизма сериализации документов MFC, могут ли его элементы быть помещены в дамп посредством механизма записи в дамп для диагностики, является ли класс типобезопасным (т. е. можно ли гарантировать тип элементов, хранящихся в коллекции и извлекаемых из нее, на основе класса).
Характеристики классов коллекций MFC
Класс | Использует C++ шаблоны |
С возможностью Сериализуются |
С возможностью помещен в дамп |
Является типобезопасный |
---|---|---|---|---|
CArray |
Да | Да 1 | Да 1 | No |
CByteArray |
No | Да | Да | Да 3 |
CDWordArray |
No | Да | Да | Да 3 |
CList |
Да | Да 1 | Да 1 | No |
CMap |
Да | Да 1 | Да 1 | No |
CMapPtrToPtr |
No | No | Да | No |
CMapPtrToWord |
No | No | Да | No |
CMapStringToOb |
No | Да | Да | No |
CMapStringToPtr |
No | No | Да | No |
CMapStringToString |
No | Да | Да | Да 3 |
CMapWordToOb |
No | Да | Да | No |
CMapWordToPtr |
No | No | Да | No |
CObArray |
No | Да | Да | No |
CObList |
No | Да | Да | No |
CPtrArray |
No | No | Да | No |
CPtrList |
No | No | Да | No |
CStringArray |
No | Да | Да | Да 3 |
CStringList |
No | Да | Да | Да 3 |
CTypedPtrArray |
Да | Зависит от обстоятельств 2 | Да | Да |
CTypedPtrList |
Да | Зависит от обстоятельств 2 | Да | Да |
CTypedPtrMap |
Да | Зависит от обстоятельств 2 | Да | Да |
CUIntArray |
No | No | Да | Да 3 |
CWordArray |
No | Да | Да | Да 3 |
Для сериализации необходимо явным образом вызвать функцию
Serialize
объекта коллекции. Для помещения в дамп необходимо явным образом вызвать его функциюDump
. Для сериализации нельзя использовать формуar << collObj
, для помещения в дамп нельзя использовать формуdmp
<< collObj
.Возможность сериализации зависит от базового типа коллекции. Например, если массив типизированных указателей основан на
CObArray
, он поддерживает сериализацию. Если он основан наCPtrArray
, его нельзя сериализовать. В общем случае классы Ptr нельзя сериализовать.Если в этом столбце указано значение "Да", нешаблонный класс коллекции является типобезопасным (при условии его использования надлежащим образом). Например, при сохранении байтов в
CByteArray
массив является типобезопасным. Однако если он используется для хранения символов, его типобезопасность не столь очевидна.
См. также
Коллекции
Классы на основе шаблонов
Практическое руководство. Создание типобезопасных коллекций
Доступ ко всем членам коллекции