Классы коллекций ATL
ATL предоставляет множество классов для хранения и доступа к данным. Какой класс вы решите использовать, зависит от нескольких факторов, в том числе:
Объем хранимых данных
Эффективность и производительность при доступе к данным
Возможность доступа к данным по индексу или по ключу
Порядок упорядочения данных
Личное предпочтение
Классы небольших коллекций
ATL предоставляет следующие классы массивов для работы с небольшим количеством объектов. Однако эти классы ограничены и предназначены для внутреннего использования ATL. Не рекомендуется использовать их в программах.
Класс | Тип хранилища данных |
---|---|
CSimpleArray | Реализует класс массива для работы с небольшим количеством объектов. |
CSimpleMap | Реализует класс сопоставления для работы с небольшим количеством объектов. |
Классы коллекции общего назначения
Следующие классы реализуют массивы, списки и карты и предоставляются как классы коллекции общего назначения:
Класс | Тип хранилища данных |
---|---|
CAtlArray | Реализует массив. |
CAtlList | Реализует список. |
CAtlMap | Реализует структуру сопоставления, на которую можно ссылаться по ключу или значению. |
CRBMap | Реализует структуру сопоставления с помощью алгоритма Red-Black. |
CRBMultiMap | Реализует структуру мультимапинга Red-Black. |
Эти классы будут перехватывать множество ошибок программирования при использовании в отладочных сборках, но для повышения производительности эти проверки не будут выполняться в розничных сборках.
Специализированные классы коллекции
Более специализированные классы коллекции также предоставляются для управления указателями памяти и указателями интерфейса:
Класс | Характер использования |
---|---|
CAutoPtrArray | Предоставляет методы, полезные при создании массива смарт-указателей. |
CAutoPtrList | Предоставляет методы, полезные при создании списка смарт-указателей. |
CComUnkArray | Хранит IUnknown указатели и предназначен для использования в качестве параметра для класса шаблона IConnectionPointImpl . |
CHeapPtrList | Предоставляет методы, полезные при создании списка указателей кучи. |
CInterfaceArray | Предоставляет методы, полезные при создании массива указателей интерфейса COM. |
CInterfaceList | Предоставляет методы, полезные при создании списка указателей интерфейса COM. |
Выбор класса коллекции
Каждый из доступных классов коллекций предлагает различные характеристики производительности, как показано в таблице ниже.
Столбцы 2 и 3 описывают характеристики упорядочения и доступа каждого класса. В таблице термин "упорядочивается" означает, что порядок вставки и удаления элементов определяет их порядок в коллекции. Это не значит, что элементы сортируются по своему содержимому. Термин "индексируется" означает, что элементы в коллекции можно получать с помощью целочисленного индекса, как элементы в обычном массиве.
Столбцы 4 и 5 описывают производительность каждого класса. В приложениях, требующих большого количества вставок в коллекцию, особое значение может иметь скорость вставки, тогда как в других приложениях наиболее важной может оказаться скорость поиска.
В столбце 6 указывается допустимость повторяющихся элементов в форме.
Производительность заданной операции класса коллекции выражается с точки зрения связи между временем, необходимым для выполнения операции, и количеством элементов в коллекции. Операция занимает время, которое увеличивается линейно по мере увеличения числа элементов, описывается как алгоритм O(n). В отличие от этого, операция занимает период времени, который увеличивается меньше и меньше по мере увеличения числа элементов, описывается как алгоритм O(log n). Таким образом, с точки зрения производительности алгоритмы O(log n) превысят алгоритмы O(n) все больше и больше по мере увеличения числа элементов.
Функции форм коллекции
Фигура | Заказано | Индексированных | Вставка элемент |
Искать указанный элемент |
Дубликат элементы |
---|---|---|---|---|---|
List | Да | Нет | Быстрое (постоянное время) | Медленный O(n) | Да |
Массив | Да | По int (постоянное время) | Медленный O(n), за исключением случаев вставки в конце, в этом случае константное время | Медленный O(n) | Да |
Map | No | По ключу (постоянное время) | Быстрое (постоянное время) | Быстрое (постоянное время) | Нет (ключи) Да (значения) |
Красная черная карта | Да (по ключу) | По ключу O(log n) | Fast O(log n) | Fast O(log n) | No |
Черно-черная мультикарта | Да (по ключу) | По ключу O(log n) (несколько значений на ключ) | Fast O(log n) | Fast O(log n) | Да (несколько значений на ключ) |
Использование объектов CTraits
Так как классы коллекций ATL можно использовать для хранения широкого спектра определяемых пользователем типов данных, это может быть полезно для переопределения важных функций, таких как сравнения. Это достигается с помощью классов CTraits.
Классы CTraits аналогичны, но более гибки, чем вспомогательные функции класса коллекции MFC; Дополнительные сведения см . в вспомогательных функциях классов коллекции.
При создании класса коллекции можно указать класс CTraits. Этот класс будет содержать код, который будет выполнять такие операции, как сравнения при вызове другими методами, составляющими класс коллекции. Например, если объект списка содержит собственные пользовательские структуры, может потребоваться переопределить тест равенства только для сравнения определенных переменных-членов. Таким образом, метод Find объекта списка будет работать более удобно.
Пример
Код
// Collection class / traits class example.
// This program demonstrates using a CTraits class
// to create a new comparison operator.
#define MAX_STRING 80
// Define our own data type to store in the list.
struct MyData
{
int ID;
TCHAR name[MAX_STRING];
TCHAR address[MAX_STRING];
};
// Define our own traits class, making use of the
// existing traits and overriding only the comparison
// we need.
class MyTraits : public CElementTraits< MyData >
{
public:
// Override the comparison to only compare
// the ID value.
static bool CompareElements(const MyData& element1, const MyData& element2)
{
if (element1.ID == element2.ID)
return true;
else
return false;
};
};
void DoAtlCustomTraitsList()
{
// Declare the array, with our data type and traits class
CAtlList < MyData, MyTraits > MyList;
// Create some variables of our data type
MyData add_item, search_item;
// Add some elements to the list.
add_item.ID = 1;
_stprintf_s(add_item.name, _T("Rumpelstiltskin"));
_stprintf_s(add_item.address, _T("One Grimm Way"));
MyList.AddHead(add_item);
add_item.ID = 2;
_stprintf_s(add_item.name, _T("Rapunzel"));
_stprintf_s(add_item.address, _T("One Grimm Way"));
MyList.AddHead(add_item);
add_item.ID = 3;
_stprintf_s(add_item.name, _T("Cinderella"));
_stprintf_s(add_item.address, _T("Two Grimm Way"));
MyList.AddHead(add_item);
// Create an element which will be used
// to search the list for a match.
search_item.ID = 2;
_stprintf_s(search_item.name, _T("Don't care"));
_stprintf_s(search_item.address, _T("Don't care"));
// Perform a comparison by searching for a match
// between any element in the list, and our
// search item. This operation will use the
// (overridden) comparison operator and will
// find a match when the IDs are the same.
POSITION i;
i = MyList.Find(search_item);
if (i != NULL)
_tprintf_s(_T("Item found!\n"));
else
_tprintf_s(_T("Item not found.\n"));
}
Комментарии
Список классов CTraits см. в разделе "Классы коллекции".
На следующей схеме показана иерархия классов для классов CTraits.
Примеры классов коллекции
В следующих примерах показаны классы коллекции: