C ++

Unikátní a objednané kontejnery v C ++

Unikátní a objednané kontejnery v C ++
6, 10, 2, 8, 4 je sada; 2, 4, 6, 8, 10 je sada stejných celých čísel uspořádaných vzestupně. V matematice má sada jedinečné prvky (odlišné prvky), to znamená, že žádný prvek se nevyskytuje vícekrát. Multiset je dále sada, kde se jakýkoli prvek může vyskytnout vícekrát. 6, 6, 10, 2, 2, 8, 4, 4, 4 je multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 je stejná multiset, ale s prvky uspořádanými vzestupně. Tento článek se nezabývá multisetem. Zabývá se datovou strukturou C ++ s názvem set.

Mapa v softwaru je jako pole, ale je to pole se dvěma sloupci místo jednoho. První sloupec má klíče a druhý sloupec má hodnoty. Každý řádek je jeden pár, který tvoří pár klíč / hodnota. Klíč přímo souvisí s jeho hodnotou.

Příklad mapy je '', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. První zde vložený pár klíč / hodnota je 'c', 3, kde 'c' je klíč a 30 je hodnota. Tato mapa není řazena pomocí klíčů. Řazení této mapy pomocí klíčů vytvoří 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Všimněte si, že mohou existovat duplicitní hodnoty, ale ne duplicitní klíče. Objednaná mapa je mapa seřazená pomocí kláves.

Multiset je sada, stejně jako multimapa mapa. To znamená, že existují mapy s duplikáty klíčů. Příkladem multimap je 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. A jak je uvedeno výše, tento článek se nezabývá multimapou, spíše se zabývá datovou strukturou C ++ nazvanou map.

V C ++ je datová struktura struktura s vlastnostmi (datové členy) a metodami (členské funkce). Data struktury jsou seznam; sada je seznam; mapa je seznam párů klíč / hodnota.

Tento článek pojednává o základech množin a map v C ++ a pro lepší pochopení tohoto článku by měl mít čtenář základní znalosti jazyka C++.

Obsah článku:

Třída a její objekty:

V C ++ se sada, mapa a další podobné struktury nazývají kontejnery. Třída je zobecněná jednotka s datovými členy, což jsou proměnné, a související členské funkce. Když jsou datovým členům dány hodnoty, vytvoří se objekt. Objekt se však tvoří v procesu zvaném instancování. Protože třída může vést k různým hodnotám pro stejné proměnné datových členů, lze ze stejné třídy vytvořit instanci různých objektů.

V C ++ je nepoužitelná sada třída a nepoužitelná mapa. Když je objekt vytvořen z nepoužitelné sady nebo nepoužitelné mapy, objekt se stane skutečnou datovou strukturou. U datových struktur sady a mapy je hlavním datovým členem seznam. Sada a mapa tvoří skupinu volaných kontejnerů, seřazených asociativních kontejnerů. Neuspořádaná sada a neuspořádaná mapa také existují, ale těm se bohužel tento článek nezabývá.

Vytvoření sady nebo mapy:

Instancí sady z její třídy třídy je vytvoření sady; vytvoření instance mapy z její třídy mapy je vytvoření mapy. Takto vytvořenému objektu je přidělen název podle volby programátora.

Aby bylo možné vytvořit sadu, program by měl začínat:

#zahrnout
#zahrnout
pomocí jmenného prostoru std;

Všimněte si směrnice „#include ”, Který zahrnuje knihovnu sad, která má třídu sad, ze které budou vytvořeny instance datových struktur sady.

Aby bylo možné vytvořit mapu, program by měl začínat:

#zahrnout
#zahrnout
pomocí jmenného prostoru std;

Všimněte si směrnice „#include ”, Který zahrnuje knihovnu map, která má třídu map, ze které budou vytvořeny instance mapových datových struktur.

Syntaxe pro vytvoření prázdné sady je:

soubor název_objektu

Příklad:

soubor setObj;

Příklad k vytvoření sady s obsahem je:

soubor setObj (6, 10, 2, 8, 4);

Syntaxe pro vytvoření prázdné mapy je:

mapa název_objektu

Příklad:

mapa mapObj;

Příklad vytvoření mapy s obsahem je:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Základy iterátoru:

Iterátor je propracovaný ukazatel, kterým lze procházet seznam datové struktury od začátku do konce.

Funkce begin () member

Členská funkce begin () vrací iterátor, který ukazuje na první prvek seznamu. Následující příklad to ilustruje pro sadu:

soubor setObj (6, 10, 2, 8, 4);
soubor:: iterator iter = setObj.začít();
cout << *iter << '\n';

Všimněte si, že způsob set () byl použit s setObj a tečkovým operátorem. iter je vrácený iterátorový objekt. Všimněte si také způsobu, jakým byla deklarována. * je indirection operator. Při použití s ​​iterem vrací první prvek sady; první prvek je 2 místo 6 - viz vysvětlení níže.

Následující příklad ilustruje použití funkce begin () pro mapu:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterator iter = mapObj.začít();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimněte si, že způsob start () byl použit s mapObj a tečkovým operátorem. iter je vrácený iterátorový objekt. Všimněte si také způsobu, jakým byla deklarována. „První“, jak se zde používá, odkazuje na klíč. „Druhý“ označuje hodnotu odpovídající klíči. Sledujte, jak byly s iterem použity k získání komponent počátečního prvku seznamu. První prvek je a, 10 místo c, 30 - viz vysvětlení níže.

Členská funkce „begin () const“

Členská funkce „begin () const“ vrací iterátor, který ukazuje na první prvek seznamu, když deklarace sady začíná const (pro konstantu). Za této podmínky nelze hodnotu v seznamu, na kterou odkazuje iterátor, iterátor změnit. Následující příklad ilustruje jeho použití pro sadu:

const sada setObj (6, 10, 2, 8, 4);
soubor:: const_iterator iter = setObj.začít();
cout << *iter << '\n';

Všimněte si, že způsob set () byl použit s setObj a tečkovým operátorem. Nebyla zadána žádná „const“ těsně po začátku (). Deklaraci však předcházelo „const“. iter zde je vrácený objekt konstantní iterátoru, který se liší od normálního iterátoru. Všimněte si také způsobu, jakým byla deklarována. * je indirection operator; jak se používá s iterem, vrací první prvek sady. První prvek je 2 místo 6 - viz vysvětlení níže.

Následující příklad ilustruje použití funkce „begin () const“ pro mapu:

mapa const mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapObj.začít();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimněte si, že způsob start () byl použit s mapObj a tečkovým operátorem. Těsně po začátku nebyla zadána žádná „const“. Deklaraci však předcházelo „const“. iter zde je vrácený objekt konstantní iterátoru, který se liší od normálního iterátoru. Všimněte si také způsobu, jakým byla deklarována. „První“, jak se zde používá, odkazuje na klíč; „Druhý“, jak se zde používá, označuje hodnotu odpovídající klíči. Sledujte, jak byly s iterem použity k získání komponent počátečního prvku seznamu. První prvek je a, 10 místo c, 30 - viz vysvětlení níže.

Člen end () funkce

Členská funkce end () vrací iterátor, který ukazuje těsně za konec seznamu. Následující příklad to ilustruje pro sadu:

soubor setObj (6, 10, 2, 8, 4);
soubor:: iterator iter = setObj.konec();
cout << *iter << '\n';

Všimněte si, že způsob end () byl použit s setObj a operátorem tečky. iter je vrácený iterátorový objekt. Všimněte si také způsobu, jakým byla deklarována. * je indirection operator; jak se používá s iterem, vrátí poslední + 1 prvek sady. V autorově počítači je tento poslední + 1 prvek 5, který není na seznamu. Tento prvek tedy nepoužívejte.

Následující příklad ilustruje použití funkce end () pro mapu:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterator iter = mapObj.konec();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimněte si, že způsob end () byl použit s mapObj a operátorem tečky. iter je vrácený iterátorový objekt. Všimněte si také způsobu, jakým byla deklarována. * je indirection operator; jak se používá s iterem, vrací poslední + 1 prvek mapy. V počítači autora je tento poslední prvek + 1 , 0, který není v seznamu. Tento prvek tedy nepoužívejte.

Členská funkce „end () const“

Členská funkce „end () const“ vrací iterátor, který ukazuje těsně za konec seznamu, když deklarace sady začíná konstantou (pro konstantu). Za této podmínky nemůže hodnotu v seznamu, na kterou odkazuje iterátor vrácený, iterátor změnit. Následující příklad ilustruje jeho použití pro sadu:

const sada setObj (6, 10, 2, 8, 4);
soubor:: const_iterator iter = setObj.konec();
cout << *iter << '\n';

Všimněte si, že způsob end () byl použit s setObj a operátorem tečky. Těsně po konci nebyla zadána žádná „const“. Deklaraci však předcházelo „const“. iter je vrácený iterátorový objekt. Všimněte si také způsobu, jakým byla deklarována. * je indirection operator; jak je použito s iter, vrací poslední + 1 prvek sady.

Následující příklad ilustruje použití funkce „end () const“ pro mapu:

mapa const mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapObj.konec();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Všimněte si, že způsob end () byl použit s mapObj a tečkovým operátorem. Těsně po konci nebyla zadána žádná „const“. Deklaraci však předcházelo „const“. iter je vrácený objekt konstantní iterátoru, který se liší od běžného iterátoru. Pečlivě také sledujte, jak bylo deklarováno.

Přístup k prvku pro sadu a mapu:

Soubor

U sady se prvek čte pomocí operátoru indirection. První dva prvky sady jsou čteny v následujícím příkladu:

soubor setObj (6, 10, 2, 8, 4);
soubor:: iterator iter = setObj.začít();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Výstup je 2, poté následuje 4 - viz vysvětlení níže. Chcete-li ukázat na další prvek seznamu, iterátor se zvýší.

Poznámka: Prvek nelze změnit pomocí operátoru indirection pro sadu. Například „* iter = 9;“ není možné.

mapa

Mapa se skládá z dvojic klíč / hodnota. Hodnotu lze načíst pomocí odpovídajícího klíče a změnit pomocí stejného klíče. Následující segment kódu to ilustruje:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapObj ['b'] = 55;
cout << mapObj['b'] << '\n';

Výstupem je:

20
55

Bodový operátor zde nebyl použit. Místo toho je použit operátor hranatých závorek, který bere klíč jako obsah.

Pořadí prvků v sadě nebo na mapě:

Prvky lze vložit do sady v libovolném pořadí. Po vložení však sada uspořádá své prvky ve vzestupném pořadí. Výchozí pořadí je vzestupné pořadí. Pokud je potřeba sestupné pořadí, pak musí být sada deklarována jako v následujícím příkladu:

soubor > setObj (6, 10, 2, 8, 4);

Takže po typu, např.G., int, u šablony je čárka, následovaná „větší“V úhlových závorkách.

Prvky lze vložit do mapy v libovolném pořadí. Po vložení však mapa přeskupí své prvky ve vzestupném pořadí podle klíče (pouze) při zachování vztahu mezi každým klíčem a jeho hodnotou. Vzestupné pořadí je výchozí pořadí; je-li potřeba sestupné pořadí, musí být mapa deklarována jako v následujícím příkladu:

mapa > mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Takže po dvojici typů, např.G., „Char, int“, u šablony je čárka, následovaná „větší“V úhlových závorkách.

Procházení sady

Cyklu while nebo for-loop s iterátorem lze použít k procházení sady. Následující příklad používá smyčku pro procházení sady, která byla nakonfigurována v sestupném pořadí:

soubor > setObj (6, 10, 2, 8, 4);
pro (set:: iterator iter = setObj.začít(); iter != setObj.konec(); ++ iter)

cout << *iter << ";

Výstupem je:

10 8 6 4 2

Inkrementace iterátoru ji nasměruje na další prvek.

Procházení mapy

Cyklu while nebo for-loop s iterátorem lze použít k procházení mapy. Následující příklad používá smyčku pro procházení mapy, která byla nakonfigurována v sestupném pořadí:

mapa > mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
pro (mapa:: iterator iter = mapObj.začít(); iter != mapObj.konec(); ++ iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Výstupem je:

e, 40, d, 30, c, 30, b, 20, a, 10,

Inkrementace iterátoru ji nasměruje na další prvek. „First“ v kódu odkazuje na klíč a „second“ odkazuje na odpovídající hodnotu. Všimněte si, jak byly tyto hodnoty získány pro výstup.

Další běžně používané členské funkce:

Funkce size ()

Tato funkce vrací celé číslo, což je počet prvků v seznamu. Nastavit příklad:

soubor > setObj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

Výstup je 5.

Příklad mapy:

mapa > mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj.size() << '\n';

Výstup je 5.

Funkce insert ()

soubor

sada neumožňuje duplikát. Takže jakýkoli vložený duplikát je tiše odmítnut. U sady je argumentem funkce insert () hodnota, která má být vložena. Hodnota se umístí do polohy, ve které pořadí v sadě zůstane vzestupně nebo sestupně. Příklad:

soubor setObj (6, 10, 2, 8, 4);
setObj.vložka (6);
setObj.vložka (9);
setObj.vložka (12);
pro (set:: iterator iter = setObj.začít(); iter != setObj.konec(); ++ iter)

cout << *iter << ";

Výstupem je:

2 4 6 8 9 10 12

Poznámka: Členskou funkci insert () lze použít k naplnění prázdné sady.

mapa

mapa neumožňuje duplikát podle klíče. Takže jakýkoli vložený duplikát je tiše odmítnut. U mapy je argumentem funkce insert () pár klíč / hodnota ve složených závorkách. Prvek je připevněn do polohy pomocí klíče, ve kterém pořadí v mapě zůstane vzestupně nebo sestupně. Příklad:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.insert ('e', 80);
mapObj.insert ('f', 50);
mapObj.insert ('g', 60);
pro (mapa:: iterator iter = mapObj.začít(); iter != mapObj.konec(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Výstupem je:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

Poznámka: Členskou funkci insert () lze použít k vyplnění prázdné mapy.

Funkce empty ()

Tato funkce vrací true, pokud je seznam prázdný, a false, pokud je to jinak. Nastavit příklad:

soubor setObj (6, 10, 2, 8, 4);
bool ret = setObj.prázdný();
cout << ret << '\n';

Výstup je 0 pro false, což znamená, že sada zde není prázdná.

Příklad mapy:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.prázdný();
cout << ret << '\n';

Výstup je 0 pro false, což znamená, že mapa zde není prázdná.

Funkce mazání ()

soubor

Zvažte následující segment kódu:

soubor setObj (10, 20, 30, 40, 50);
soubor:: iterator iter = setObj.začít();
soubor:: iterátor itr = setObj.vymazat (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.vymazat (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Výstupem je:

nová velikost: 4
další hodnota: 20
nová velikost: 3
další hodnota: 30

Funkce erase () přebírá iterátor, který ukazuje na prvek jako argument. Po vymazání prvku funkce erase () vrátí iterátor, který ukazuje na další prvek.

mapa

Zvažte následující segment kódu:

mapa mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
mapa:: iterator iter = mapObj.začít();
mapa:: iterator itr = mapObj.vymazat (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.vymazat (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Výstupem je:

nová velikost: 4
další hodnotový pár: b, 20
nová velikost: 3
další hodnotový pár: c, 30

Funkce erase () přebírá iterátor, který ukazuje na prvek jako argument. Po vymazání prvku funkce erase () vrátí iterátor, který ukazuje na další prvek.

Funkce clear ()

Funkce clear () odstraní všechny prvky v seznamu. Nastavit příklad:

soubor setObj (6, 10, 2, 8, 4);
setObj.Průhledná();
cout << setObj.size() << '\n';

Výstup je 0.

příklad mapy:

mapa mapObj ('', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.Průhledná();
cout << mapObj.size() << '\n';

Výstup je 0.

Závěr:

Sada datové struktury v C ++ je struktura, ve které je seznam prvků uložen ve výchozím vzestupném pořadí nebo v sestupném pořadí podle volby programátora. Všechny prvky sady jsou jedinečné. Struktura mapových dat v C ++ je struktura, ve které je seznam hash párů klíč / hodnota, uložený ve vzestupném pořadí klíčů ve výchozím nastavení nebo v sestupném pořadí klíčů podle volby programátora. Klíče jsou také jedinečné a mohou existovat duplikované hodnoty. Hlavním datovým členem kterékoli ze struktur je seznam. Každá struktura má členské funkce, z nichž některé se běžně používají.

Jak používat Xdotool ke stimulaci kliknutí myší a klávesových zkratek v systému Linux
Xdotool je bezplatný a otevřený nástroj příkazového řádku pro simulaci kliknutí myší a stisknutí kláves. Tento článek se bude věnovat krátkému průvodc...
Top 5 ergonomických produktů pro počítačové myši pro Linux
Způsobuje dlouhodobé používání počítače bolest zápěstí nebo prstů? Trpíte ztuhlými klouby a neustále si musíte třást ruce? Cítíte pálivou bolest pokaž...
Jak změnit nastavení myši a touchpadu pomocí Xinput v Linuxu
Většina linuxových distribucí je ve výchozím nastavení dodávána s knihovnou „libinput“ pro zpracování vstupních událostí v systému. Může zpracovávat v...