CMap
Třída
Třída kolekce slovníku, která mapuje jedinečné klíče na hodnoty.
Syntaxe
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>class CMap : public CObject
Parametry
KEY
Třída objektu použitého jako klíč k mapě.
ARG_KEY
Datový typ použitý pro KEY
argumenty; obvykle odkaz na KEY
.
VALUE
Třída objektu uloženého v mapě
ARG_VALUE
Datový typ použitý pro VALUE
argumenty; obvykle odkaz na VALUE
.
Členové
Veřejné struktury
Název | Popis |
---|---|
CMap::CPair |
Vnořená struktura obsahující hodnotu klíče a hodnotu přidruženého objektu. |
Veřejné konstruktory
Název | Popis |
---|---|
CMap::CMap |
Vytvoří kolekci, která mapuje klíče na hodnoty. |
Veřejné metody
Název | Popis |
---|---|
CMap::GetCount |
Vrátí počet prvků v této mapě. |
CMap::GetHashTableSize |
Vrátí počet prvků v tabulce hash. |
CMap::GetNextAssoc |
Získá další prvek pro iterování. |
CMap::GetSize |
Vrátí počet prvků v této mapě. |
CMap::GetStartPosition |
Vrátí pozici prvního prvku. |
CMap::InitHashTable |
Inicializuje tabulku hash a určuje její velikost. |
CMap::IsEmpty |
Testuje podmínku prázdné mapy (žádné prvky). |
CMap::Lookup |
Vyhledá hodnotu namapovanou na daný klíč. |
CMap::PGetFirstAssoc |
Vrátí ukazatel na první prvek. |
CMap::PGetNextAssoc |
Získá ukazatel na další prvek pro iterování. |
CMap::PLookup |
Vrátí ukazatel na klíč, jehož hodnota odpovídá zadané hodnotě. |
CMap::RemoveAll |
Odebere všechny prvky z této mapy. |
CMap::RemoveKey |
Odebere prvek určený klíčem. |
CMap::SetAt |
Vloží prvek do mapy; nahradí existující prvek, pokud je nalezen odpovídající klíč. |
Veřejné operátory
Název | Popis |
---|---|
CMap::operator [ ] |
Vloží prvek do mapy – nahrazení operátoru SetAt . |
Poznámky
Po vložení páru klíč-hodnota (element) do mapy můžete dvojici efektivně načíst nebo odstranit pomocí klíče, abyste k němu získali přístup. Můžete také iterovat všechny prvky v mapě.
Proměnná typu POSITION
se používá pro alternativní přístup k položkám. Položku si můžete POSITION
zapamatovat a iterovat pomocí mapy. Možná si myslíte, že tato iterace je sekvenční podle hodnoty klíče; to není. Posloupnost načtených prvků je neurčitá.
Některé členské funkce této třídy volají globální pomocné funkce, které musí být přizpůsobeny pro většinu použití CMap
třídy. Viz Pomocné rutiny třídy kolekce v části Makra a globální hodnoty v referenční dokumentaci MFC.
CMap
přepsání CObject::Serialize
na podporu serializace a dumpingu jejích prvků. Pokud je mapa uložena do archivu pomocí Serialize
, každý prvek mapy je serializován postupně. Výchozí implementace SerializeElements
pomocné funkce provede bitové zápisy. Informace o serializaci položek kolekce ukazatelů odvozených z CObject
nebo jiných uživatelem definovaných typů naleznete v tématu Postupy: Vytvoření kolekce typu bezpečné.
Pokud potřebujete diagnostický výpis jednotlivých prvků v mapě (klíče a hodnoty), musíte nastavit hloubku kontextu výpisu na hodnotu 1 nebo vyšší.
Při odstranění objektu CMap
nebo při odebrání jeho prvků se klíče a hodnoty odeberou.
Odvození třídy mapování se podobá odvození seznamu. Na obrázku odvození třídy seznamu pro zvláštní účely najdete v článku Kolekce .
Hierarchie dědičnosti
CMap
Požadavky
Záhlaví: afxtempl.h
CMap::CMap
Vytvoří prázdnou mapu.
CMap(INT_PTR nBlockSize = 10);
Parametry
nBlockSize
Určuje členitost přidělení paměti pro rozšíření mapy.
Poznámky
S rostoucím nárůstem mapy se paměť přiděluje v jednotkách nBlockSize
položek.
Příklad
// declares a map of ints to points
CMap<int, int, CPoint, CPoint> myMap(16);
CMap::CPair
Obsahuje hodnotu klíče a hodnotu přidruženého objektu.
Poznámky
Jedná se o vnořenou strukturu v rámci třídy CMap
.
Struktura se skládá ze dvou polí:
key
Skutečná hodnota typu klíče.value
Hodnota přidruženého objektu.
Slouží k ukládání vrácených hodnot z CMap::PLookup
, CMap::PGetFirstAssoc
a CMap::PGetNextAssoc
.
Příklad
Příklad použití najdete v příkladu .CMap::PLookup
CMap::GetCount
Načte počet prvků v mapě.
INT_PTR GetCount() const;
Návratová hodnota
Počet prvků.
Příklad
Podívejte se na příklad pro CMap::Lookup
.
CMap::GetHashTableSize
Určuje počet prvků v tabulce hash pro mapu.
UINT GetHashTableSize() const;
Návratová hodnota
Počet prvků v tabulce hash
Příklad
CMap<int, int, CPoint, CPoint> myMap;
UINT uTableSize = myMap.GetHashTableSize();
CMap::GetNextAssoc
Načte prvek mapy na a rNextPosition
pak aktualizuje rNextPosition
odkaz na další prvek v mapě.
void GetNextAssoc(
POSITION& rNextPosition,
KEY& rKey,
VALUE& rValue) const;
Parametry
rNextPosition
Určuje odkaz na POSITION
hodnotu vrácenou předchozím GetNextAssoc
voláním nebo GetStartPosition
voláním.
KEY
Parametr šablony určující typ klíče mapy.
rKey
Určuje vrácený klíč načteného prvku.
VALUE
Parametr šablony určující typ hodnoty mapy.
rValue
Určuje vrácenou hodnotu načteného prvku.
Poznámky
Tato funkce je nejužitečnější pro iteraci všemi prvky v mapě. Všimněte si, že pořadí pozic nemusí být nutně stejné jako posloupnost klíčových hodnot.
Pokud je načtený prvek poslední v mapě, pak je nová hodnota rNextPosition
nastavena na NULL
.
Příklad
Podívejte se na příklad pro CMap::SetAt
.
CMap::GetSize
Vrátí počet prvků mapy.
INT_PTR GetSize() const;
Návratová hodnota
Počet položek v mapě.
Poznámky
Voláním této metody načtěte počet prvků v mapě.
Příklad
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);
}
CMap::GetStartPosition
Spustí iteraci mapy vrácením POSITION
hodnoty, kterou lze předat GetNextAssoc
volání.
POSITION GetStartPosition() const;
Návratová hodnota
Hodnota POSITION
, která označuje počáteční pozici pro iteraci mapy, nebo NULL
pokud je mapa prázdná.
Poznámky
Posloupnost iterací není předvídatelná; proto "první prvek v mapě" nemá žádný zvláštní význam.
Příklad
Podívejte se na příklad pro CMap::SetAt
.
CMap::InitHashTable
Inicializuje tabulku hash.
void InitHashTable(UINT hashSize, BOOL bAllocNow = TRUE);
Parametry
hashSize
Počet položek v tabulce hash
bAllocNow
Pokud TRUE
při inicializaci přiděluje hashovací tabulku, v opačném případě je tabulka přidělena v případě potřeby.
Poznámky
Pro zajištění nejlepšího výkonu by velikost tabulky hash měla být primárním číslem. Aby se minimalizovaly kolize, měla by být velikost přibližně 20 % větší než největší očekávaná datová sada.
Příklad
Podívejte se na příklad pro CMap::Lookup
.
CMap::IsEmpty
Určuje, zda je mapa prázdná.
BOOL IsEmpty() const;
Návratová hodnota
Nenulové, pokud tato mapa neobsahuje žádné prvky; jinak 0.
Příklad
Podívejte se na příklad pro CMap::RemoveAll
.
CMap::Lookup
Vyhledá hodnotu namapovanou na daný klíč.
BOOL Lookup(ARG_KEY key, VALUE& rValue) const;
Parametry
ARG_KEY
Parametr šablony určující typ key
hodnoty.
key
Určuje klíč, který identifikuje prvek, který se má vyhledat.
VALUE
Určuje typ hodnoty, která se má vyhledat.
rValue
Získá hledaná hodnota.
Návratová hodnota
Nenulové, pokud byl prvek nalezen; jinak 0.
Poznámky
Lookup
používá algoritmus hash k rychlému vyhledání prvku mapy s klíčem, který přesně odpovídá danému klíči.
Příklad
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);
}
CMap::operator [ ]
Pohodlná náhrada členské SetAt
funkce.
VALUE& operator[](arg_key key);
Parametry
VALUE
Parametr šablony určující typ hodnoty mapy.
ARG_KEY
Parametr šablony určující typ hodnoty klíče
key
Klíč použitý k načtení hodnoty z mapy.
Poznámky
Lze jej tedy použít pouze na levé straně příkazu přiřazení (l-hodnota). Pokud neexistuje žádný prvek mapování se zadaným klíčem, vytvoří se nový prvek.
Neexistuje žádná "pravá strana" (r-value) ekvivalentní tomuto operátoru, protože existuje možnost, že klíč nelze v mapě najít. Pro načtení elementu Lookup
použijte členovou funkci.
Příklad
Podívejte se na příklad pro CMap::Lookup
.
CMap::PGetFirstAssoc
Vrátí první položku objektu mapy.
const CPair* PGetFirstAssoc() const;
CPair* PGetFirstAssoc();
Návratová hodnota
Ukazatel na první položku v mapě; viz .CMap::CPair
Pokud mapa neobsahuje žádné položky, hodnota je NULL
.
Poznámky
Voláním této funkce vrátíte ukazatel prvního prvku v objektu mapy.
Příklad
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++;
}
CMap::PGetNextAssoc
Načte prvek mapy, na který pAssocRec
odkazuje .
const CPair *PGetNextAssoc(const CPair* pAssocRet) const;
CPair *PGetNextAssoc(const CPair* pAssocRet);
Parametry
pAssocRet
Odkazuje na položku mapy vrácenou předchozím PGetNextAssoc
voláním nebo CMap::PGetFirstAssoc
voláním.
Návratová hodnota
Ukazatel na další položku v mapě; viz .CMap::CPair
Pokud je prvek poslední v mapě, hodnota je NULL
.
Poznámky
Voláním této metody iterujte všechny prvky v mapě. Načtěte první prvek voláním PGetFirstAssoc
a pak iterujte mapou s následnými voláními PGetNextAssoc
.
Příklad
Podívejte se na příklad pro CMap::PGetFirstAssoc
.
CMap::PLookup
Vyhledá hodnotu namapovanou na daný klíč.
const CPair* PLookup(ARG_KEY key) const;
CPair* PLookup(ARG_KEY key);
Parametry
key
Klíč pro prvek, který se má vyhledat.
Návratová hodnota
Ukazatel na strukturu klíče; viz .CMap::CPair
Pokud se nenajde žádná shoda, CMap::PLookup
vrátí hodnotu NULL
.
Poznámky
Voláním této metody vyhledejte prvek mapy s klíčem, který přesně odpovídá danému klíči.
Příklad
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);
}
CMap::RemoveAll
Odebere všechny hodnoty z této mapy voláním globální pomocné funkce DestructElements
.
void RemoveAll();
Poznámky
Funkce funguje správně, pokud je mapa již prázdná.
Příklad
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());
CMap::RemoveKey
Vyhledá položku mapy odpovídající zadanému klíči; pokud se klíč najde, odebere položku.
BOOL RemoveKey(ARG_KEY key);
Parametry
ARG_KEY
Parametr šablony určující typ klíče
key
Klíč pro prvek, který se má odebrat.
Návratová hodnota
Nenulové, pokud byla položka nalezena a úspěšně odstraněna; jinak 0.
Poznámky
Pomocná DestructElements
funkce slouží k odebrání položky.
Příklad
Podívejte se na příklad pro CMap::SetAt
.
CMap::SetAt
Primárním prostředkem pro vložení elementu do mapy.
void SetAt(ARG_KEY key, ARG_VALUE newValue);
Parametry
ARG_KEY
Parametr šablony určující typ parametru key
.
key
Určuje klíč nového prvku.
ARG_VALUE
Parametr šablony určující typ parametru newValue
.
newValue
Určuje hodnotu nového prvku.
Poznámky
Za prvé, klíč se hledá. Pokud se klíč najde, změní se odpovídající hodnota; v opačném případě se vytvoří nový pár klíč-hodnota.
Příklad
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);
}