Поделиться через


Классы коллекций 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.

Схема, показывающая иерархию признаков для классов коллекции.

Примеры классов коллекции

В следующих примерах показаны классы коллекции:

См. также

Основные понятия
Классы коллекций