Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Использование простых ассоциативных массивов




Шаблонный класс ассоциативный массив CMap имеет четыре параметра: KEY, ARG_KEY, VALUE и ARG_VALUE. Подобно массивам CArray и спискам CList, этот массив может сохранять данные любого типа. Однако, в отличие от массивов и списков, которые оперируют индексами и их элементы являются упорядоченными, ассоциативные массивы оперируют ключами и значениями: Вы можете получить доступ к элементу массива только по его уникальному ключу. Параметр KEY определяет тип данных, которые используются в качестве ключа. Если типом KEY является структура или класс, то в качестве ARG_KEY обычно указывают ссылку на KEY. В свою очередь параметр шаблона VALUE специфицирует тип данных, хранящихся в массиве. Если этот тип структура или класс, то в качестве ARG_ VALUE обычно указывают ссылку на VALUE. Например:

CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;

CMap< CString, LPCSTR, CPerson, CPerson& > myMap2;

 

Массив myMap2 может представлять собой простую адресную книгу, в которой Вы получаете сведения о личности по ее фамилии.

Поскольку параметр KEY имеет тип CString и параметр KEY_TYPE – тип LPCSTR, ключи сохраняются в массиве как объекты типа CString, однако ссылки на них в функциях, таких как SetAt(), должны быть указателями типа LPCSTR. Например:

CMap< CString, LPCSTR, CPerson, CPerson& > myMap2;

CPerson person;

// …

LPCSTR lpstrName = "Jones";

myMap2->SetAt(lpstrName, person);

 

Использование шаблонов коллекций типизированных указателей

Для использования таких шаблонов необходимо знать, какие типы данных можно в них сохранять и какие параметры надо использовать в шаблонах.

 

Использование массивов и списков типизированных указателей

 

Шаблоны массивов CTypedPtrArray и списков CTypedPtrList типизированных указателей требуют два параметра: BASE_CLASS и TYPE. Эти классы могут сохранять типы данных, которые указаны в параметре TYPE. Эти классы наследуются от одного из нешаблонных классов коллекций, которые хранят указатели. Этот самый базовый класс указывается как параметр BASE_CLASS. Для массивов надо использовать CObArray или CPtrArray, а для списков – CObList или CPtrList.

В результате, когда Вы объявляете коллекцию на основе, скажем, CObList, новый класс не только наследует члены своего базового класса, но и также содержит объявления ряда типо-безопасных функций и операций, которые обеспечивают типо-безопасность путем вызова член-функций базового класса. Инкапсулированные функции поддерживают все необходимые преобразования типов. Например:

CTypedPtrArray<CObArray, CPerson*> myArray;

CTypedPtrList<CPtrList, MY_STRUCT*> myList;

 

В первом примере объявляется массив myArray типизированных указателей на объекты класса CPerson (который предполагается производным от CObject). Теперь Вы можете вызывать любую член-функцию класса или новые типо-безопасные функции GetAt() и ElementAt() или использовать перегруженную операцию доступа по индексу [].

Во втором примере объявляется список типизированных указателей myList, производный от CPtrList. Список хранит и возвращает указатели на объекты типа MY_STRUCT. Класс, наследуемый от CPtrList, используется для хранения указателей на объекты, которые не являются производными от CObject. Класс имеет ряд типо-безопасных функций: GetHead(), GetTail(), RemoveHead(), RemoveTail(), GetNext(), GetPrev() и GetAt().

Использование типизированных указателей на ассоциативные массивы

 

Шаблон класса типизированных указателей на ассоциативные массивы CTypedPtrMap имеет три параметра: BASE_CLASS, KEY и VALUE. Параметр BASE_CLASS указывает на базовый класс, от которого наследуется объявляемый: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb и т.д. Параметр KEY аналогичен такому же параметру класса CMap: он указывает тип ключа, который используется для доступа к элементам коллекции. Параметр VALUE аналогичен такому же параметру CMap: он специфицирует тип объектов, которые сохраняются в массиве. Например:

CTypedPtrMap <CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;

CTypedPtrMap <CMapStringToOb, CString, CMyObject*> myObjectMap;

 

В первом примере объявляется ассоциативный массив, производный от CMapPtrToPtr, и он использует ключи типа CString . Эти ключи служат для доступа к указателям на MY_STRUCT. Вы можете использовать функцию Lookup() для поиска требуемого элемента или использовать перегруженную операцию доступа по индексу [] для добавления нового элемента. И Вы также можете перебирать элементы массива с использованием типо-безопасной функции GetNextAssoc() или любые другие функции базового класса CMapPtrToPtr.

Во втором примере объявляется ассоциативный массив, производный от CMapStringToOb, и он использует ключи типа CString. Эти ключи служат для доступа к указателям на CMyObject. Вы можете использовать такие же типо-безопасные член-функции, как и в первом примере.

Замечание. Если в качестве параметра Вы указываете структуру или класс, а не указатель или ссылку на этот тип, структура или класс должны иметь конструктор копирования.










Последнее изменение этой страницы: 2018-04-12; просмотров: 414.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...