Класс CMap
В этой статье
Класс коллекции словарей, который сопоставляет уникальные ключи значениям.
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>class CMap : public CObject
KEY
Класс объекта, используемого в качестве ключа для карты.
ARG_KEY
Тип данных, используемый для KEY
аргументов; обычно ссылка на KEY
.
VALUE
Класс объекта, хранящегося на карте.
ARG_VALUE
Тип данных, используемый для VALUE
аргументов; обычно ссылка на VALUE
.
Имя | Описание |
---|---|
CMap::CPair |
Вложенная структура, содержащая значение ключа и значение связанного объекта. |
Имя | Описание |
---|---|
CMap::CMap |
Создает коллекцию, которая сопоставляет ключи со значениями. |
Имя | Описание |
---|---|
CMap::GetCount |
Возвращает количество элементов в этой карте. |
CMap::GetHashTableSize |
Возвращает количество элементов в хэш-таблице. |
CMap::GetNextAssoc |
Возвращает следующий элемент для итерации. |
CMap::GetSize |
Возвращает количество элементов в этой карте. |
CMap::GetStartPosition |
Возвращает положение первого элемента. |
CMap::InitHashTable |
Инициализирует хэш-таблицу и задает его размер. |
CMap::IsEmpty |
Проверяет условие пустой карты (без элементов). |
CMap::Lookup |
Ищет значение, сопоставленное с заданным ключом. |
CMap::PGetFirstAssoc |
Возвращает указатель на первый элемент. |
CMap::PGetNextAssoc |
Возвращает указатель на следующий элемент для итерации. |
CMap::PLookup |
Возвращает указатель на ключ, значение которого соответствует указанному значению. |
CMap::RemoveAll |
Удаляет все элементы из этой карты. |
CMap::RemoveKey |
Удаляет элемент, указанный ключом. |
CMap::SetAt |
Вставляет элемент в карту; заменяет существующий элемент, если найден соответствующий ключ. |
Имя | Описание |
---|---|
CMap::operator [ ] |
Вставляет элемент в карту — подстановку SetAt оператора. |
После вставки пары "ключ-значение" (элемент) в карту можно эффективно извлекать или удалять пару с помощью ключа для доступа к ней. Вы также можете выполнить итерацию по всем элементам карты.
Переменная типа POSITION
используется для альтернативного доступа к записям. Вы можете использовать POSITION
запись "запоминать" и выполнять итерацию по карте. Вы можете подумать, что эта итерация является последовательной по значению ключа; Нет. Последовательность извлеченных элементов является неопределенной.
Некоторые функции-члены этого класса вызывают глобальные вспомогательные функции, которые необходимо настроить для большинства использования CMap
класса. Справочные материалы по классам коллекции см. в разделе "Макросы и глобальные" справочника по MFC.
CMap
переопределяется CObject::Serialize
для поддержки сериализации и дампа его элементов. Если карта хранится в архиве с помощью Serialize
, каждый элемент карты сериализуется в свою очередь. Реализация вспомогательной SerializeElements
функции по умолчанию выполняет побитовую запись. Сведения о сериализации элементов коллекции указателей, производных от CObject
определенных пользователем типов, см. в статье "Практическое руководство. Создание коллекции с безопасностью типа".
Если вам нужен диагностический дамп отдельных элементов карты (ключи и значения), необходимо задать глубину контекста дампа 1 или больше.
CMap
При удалении объекта или при удалении его элементов ключи и значения удаляются.
Производный класс карты аналогичен выводу списка. См. статью "Коллекции" для иллюстрации производных класса списка специального назначения.
CMap
Заголовок: afxtempl.h
Создает пустую карту.
CMap(INT_PTR nBlockSize = 10);
nBlockSize
Указывает степень детализации выделения памяти для расширения карты.
По мере роста карты память выделяется в единицах nBlockSize
записей.
// declares a map of ints to points
CMap<int, int, CPoint, CPoint> myMap(16);
Содержит значение ключа и значение связанного объекта.
Это вложенная структура в классе CMap
.
Структура состоит из двух полей:
key
Фактическое значение типа ключа.value
Значение связанного объекта.
Он используется для хранения возвращаемых значений из CMap::PLookup
, CMap::PGetFirstAssoc
и CMap::PGetNextAssoc
.
Пример использования см. в примере.CMap::PLookup
Извлекает количество элементов в карте.
INT_PTR GetCount() const;
Число элементов.
Пример см. в примере CMap::Lookup
.
Определяет количество элементов в хэш-таблице карты.
UINT GetHashTableSize() const;
Количество элементов в хэш-таблице.
CMap<int, int, CPoint, CPoint> myMap;
UINT uTableSize = myMap.GetHashTableSize();
Извлекает элемент rNextPosition
карты по адресу, а затем обновляется rNextPosition
, чтобы ссылаться на следующий элемент в карте.
void GetNextAssoc(
POSITION& rNextPosition,
KEY& rKey,
VALUE& rValue) const;
rNextPosition
Указывает ссылку на POSITION
значение, возвращаемое предыдущим GetNextAssoc
или GetStartPosition
вызовом.
KEY
Параметр шаблона, указывающий тип ключа карты.
rKey
Указывает возвращаемый ключ извлеченного элемента.
VALUE
Параметр шаблона, указывающий тип значения карты.
rValue
Указывает возвращаемое значение извлеченного элемента.
Эта функция наиболее полезна для итерации всех элементов в карте. Обратите внимание, что последовательность позиций не обязательно совпадает с последовательностью значений ключа.
Если извлеченный элемент является последним в карте, то для нового значения rNextPosition
задано значение NULL
.
Пример см. в примере CMap::SetAt
.
Возвращает количество элементов карты.
INT_PTR GetSize() const;
Количество элементов на карте.
Вызовите этот метод, чтобы получить количество элементов в карте.
CMap<int, int, CPoint, CPoint> myMap;
myMap.InitHashTable(257);
// Add 200 elements to the map.
for (int i = 0; i < 200; i++)
{
myMap[i] = CPoint(i, i);
}
// Remove the elements with even key values.
CPoint pt;
for (int i = 0; myMap.Lookup(i, pt); i += 2)
{
myMap.RemoveKey(i);
}
ASSERT(myMap.GetSize() == 100);
TRACE(_T("myMap with %d elements:\n"), myMap.GetCount());
POSITION pos = myMap.GetStartPosition();
int iKey;
CPoint ptVal;
while (pos != NULL)
{
myMap.GetNextAssoc(pos, iKey, ptVal);
TRACE(_T("\t[%d] = (%d,%d)\n"), iKey, ptVal.x, ptVal.y);
}
Запускает итерацию карты, возвращая POSITION
значение, которое можно передать вызову GetNextAssoc
.
POSITION GetStartPosition() const;
POSITION
Значение, указывающее начальную позицию для итерации карты; или NULL
если карта пуста.
Последовательность итерации не предсказуема; Таким образом, "первый элемент в карте" не имеет особого значения.
Пример см. в примере CMap::SetAt
.
Инициализирует хэш-таблицу.
void InitHashTable(UINT hashSize, BOOL bAllocNow = TRUE);
hashSize
Количество записей в хэш-таблице.
bAllocNow
Если TRUE
, выделяет хэш-таблицу при инициализации; в противном случае таблица выделяется при необходимости.
Для оптимальной производительности хэш-таблица должна быть простым числом. Чтобы свести к минимуму столкновения, размер должен быть примерно на 20 процентов больше, чем самый большой ожидаемый набор данных.
Пример см. в примере CMap::Lookup
.
Определяет, является ли карта пустой.
BOOL IsEmpty() const;
Ненулевое значение, если эта карта не содержит элементов; в противном случае — 0.
Пример см. в примере CMap::RemoveAll
.
Ищет значение, сопоставленное с заданным ключом.
BOOL Lookup(ARG_KEY key, VALUE& rValue) const;
ARG_KEY
Параметр шаблона, указывающий key
тип значения.
key
Указывает ключ, определяющий элемент для поиска.
VALUE
Указывает тип значения для поиска.
rValue
Получает значение подстановки.
Ненулевое значение, если элемент найден; в противном случае — 0.
Lookup
использует алгоритм хэширования для быстрого поиска элемента карты с ключом, который точно соответствует заданному ключу.
CMap<int, int, CPoint, CPoint> myMap;
myMap.InitHashTable(257);
// Add 200 elements to the map.
for (int i = 0; i < 200; i++)
{
myMap[i] = CPoint(i, i);
}
// Remove the elements with even key values.
CPoint pt;
for (int i = 0; myMap.Lookup(i, pt); i += 2)
{
myMap.RemoveKey(i);
}
ASSERT(myMap.GetSize() == 100);
TRACE(_T("myMap with %d elements:\n"), myMap.GetCount());
POSITION pos = myMap.GetStartPosition();
int iKey;
CPoint ptVal;
while (pos != NULL)
{
myMap.GetNextAssoc(pos, iKey, ptVal);
TRACE(_T("\t[%d] = (%d,%d)\n"), iKey, ptVal.x, ptVal.y);
}
Удобная замена SetAt
функции-члена.
VALUE& operator[](arg_key key);
VALUE
Параметр шаблона, указывающий тип значения карты.
ARG_KEY
Параметр шаблона, указывающий тип значения ключа.
key
Ключ, используемый для получения значения из карты.
Таким образом, его можно использовать только в левой части инструкции назначения (l-value). Если элемент map с указанным ключом отсутствует, создается новый элемент.
Нет эквивалента "правой стороны" (r-value) этому оператору, так как существует вероятность того, что ключ не найден на карте. Используйте функцию-член Lookup
для извлечения элементов.
Пример см. в примере CMap::Lookup
.
Возвращает первую запись объекта map.
const CPair* PGetFirstAssoc() const;
CPair* PGetFirstAssoc();
Указатель на первую запись в карте; см. раздел CMap::CPair
. Если карта не содержит записей, значение равно NULL
.
Вызовите эту функцию, чтобы вернуть указатель на первый элемент в объекте map.
typedef CMap<int, int, CPoint, CPoint> CMyMap;
CMyMap myMap;
myMap.InitHashTable(257);
// Add 10 elements to the map.
for (int i = 0; i <= 10; i++)
myMap.SetAt(i, CPoint(i, i));
// Print the element value with even key values.
int nKey = 0;
CPoint pt;
CMyMap::CPair *pCurVal;
pCurVal = myMap.PGetFirstAssoc();
while (pCurVal != NULL)
{
if ((nKey % 2) == 0)
{
_tprintf_s(_T("Current key value at %d: %d,%d\n"),
pCurVal->key, pCurVal->value.x, pCurVal->value.y);
}
pCurVal = myMap.PGetNextAssoc(pCurVal);
nKey++;
}
Извлекает элемент карты, на который указывает pAssocRec
.
const CPair *PGetNextAssoc(const CPair* pAssocRet) const;
CPair *PGetNextAssoc(const CPair* pAssocRet);
pAssocRet
Указывает на запись карты, возвращаемую предыдущим PGetNextAssoc
или CMap::PGetFirstAssoc
вызовом.
Указатель на следующую запись в карте; см. раздел CMap::CPair
. Если элемент является последним в карте, значение равно NULL
.
Вызовите этот метод для итерации всех элементов карты. Извлеките первый элемент с вызовом PGetFirstAssoc
, а затем выполните итерацию по карте с последовательными вызовами PGetNextAssoc
.
Пример см. в примере CMap::PGetFirstAssoc
.
Находит значение, сопоставленное с заданным ключом.
const CPair* PLookup(ARG_KEY key) const;
CPair* PLookup(ARG_KEY key);
key
Ключ для поиска элемента.
Указатель на ключевую структуру; см. раздел CMap::CPair
. Если совпадение не найдено, CMap::PLookup
возвращается NULL
.
Вызовите этот метод для поиска элемента карты с ключом, который точно соответствует заданному ключу.
typedef CMap<int, int, CPoint, CPoint> CMyMap;
CMyMap myMap;
myMap.InitHashTable(257);
// Add 10 elements to the map.
for (int i = 0; i <= 10; i++)
myMap[i] = CPoint(i, i);
// Print the element values with even key values.
CMyMap::CPair *pCurVal;
for (int i = 0; i <= myMap.GetCount(); i += 2)
{
pCurVal = myMap.PLookup(i);
_tprintf_s(_T("Current key value at %d: %d,%d\n"),
pCurVal->key, pCurVal->value.x, pCurVal->value.y);
}
Удаляет все значения из этой карты путем вызова функции DestructElements
глобального вспомогательного средства.
void RemoveAll();
Функция работает правильно, если карта уже пуста.
CMap<int, int, CPoint, CPoint> myMap;
// Add 10 elements to the map.
for (int i = 0; i < 10; i++)
myMap.SetAt(i, CPoint(i, i));
myMap.RemoveAll();
ASSERT(myMap.IsEmpty());
Ищет запись карты, соответствующую предоставленному ключу; Затем, если ключ найден, удаляет запись.
BOOL RemoveKey(ARG_KEY key);
ARG_KEY
Параметр шаблона, указывающий тип ключа.
key
Ключ для удаления элемента.
Ненулевое значение, если запись найдена и успешно удалена; в противном случае — 0.
Вспомогательные DestructElements
функции используются для удаления записи.
Пример см. в примере CMap::SetAt
.
Основное средство вставки элемента в карту.
void SetAt(ARG_KEY key, ARG_VALUE newValue);
ARG_KEY
Параметр шаблона, указывающий key
тип параметра.
key
Указывает ключ нового элемента.
ARG_VALUE
Параметр шаблона, указывающий newValue
тип параметра.
newValue
Указывает значение нового элемента.
Во-первых, ключ ищется. Если ключ найден, соответствующее значение изменяется; в противном случае создается новая пара "ключ-значение".
CMap<int, int, CPoint, CPoint> myMap;
// Add 10 elements to the map.
for (int i = 0; i < 10; i++)
myMap.SetAt(i, CPoint(i, i));
// Remove the elements with even key values.
POSITION pos = myMap.GetStartPosition();
int nKey;
CPoint pt;
while (pos != NULL)
{
myMap.GetNextAssoc(pos, nKey, pt);
if ((nKey % 2) == 0)
myMap.RemoveKey(nKey);
}
// Print the element values.
pos = myMap.GetStartPosition();
while (pos != NULL)
{
myMap.GetNextAssoc(pos, nKey, pt);
_tprintf_s(_T("Current key value at %d: %d,%d\n"),
nKey, pt.x, pt.y);
}