C ++

Containere unice și comandate în C ++

Containere unice și comandate în C ++
6, 10, 2, 8, 4 este un set; 2, 4, 6, 8, 10 este un set de aceleași numere întregi, dispuse în ordine crescătoare. În matematică, un set are elemente unice (elemente distincte) și, adică, niciun element nu apare de mai multe ori. Mai mult, un multiset este un set, în care orice element poate apărea de mai multe ori. 6, 6, 10, 2, 2, 8, 4, 4, 4 este un multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 este același multiset, dar cu elementele aranjate în ordine crescătoare. Acest articol nu tratează multiset. Se ocupă de structura de date C ++ numită, set.

O hartă din software este ca o matrice, dar este o matrice cu două coloane în loc de una. Prima coloană are cheile și a doua coloană are valorile. Fiecare rând este o pereche, formând o pereche cheie / valoare. O cheie este direct legată de valoarea sa.

Un exemplu de hartă este 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Prima pereche cheie / valoare inserată aici este 'c', 3, unde 'c' este cheia și 30 este valoarea. Această hartă nu este comandată de chei. Ordonarea acestei hărți prin taste produce 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Observați că pot exista valori duplicate, dar nu chei duplicate. O hartă ordonată este o hartă ordonată prin chei.

Un multiset este un set, așa cum un multimap este o hartă. Aceasta înseamnă că există hărți cu chei duplicate. Un exemplu de multimapă este 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. Și, după cum sa menționat mai sus, acest articol nu tratează multimap, ci se referă la structura de date C ++ numită, hartă.

În C ++, o structură de date este o structură cu proprietăți (membri de date) și metode (funcții de membru). Datele structurii sunt o listă; un set este o listă; o hartă este o listă de perechi cheie / valoare.

Acest articol discută elementele de bază ale seturilor și hărților în C ++ și, pentru a înțelege mai bine acest articol, cititorul ar fi trebuit să aibă cunoștințe de bază despre C++.

Conținutul articolului:

Clasa și obiectele sale:

În C ++, setul, harta și alte structuri similare sunt numite containere. O clasă este o unitate generalizată cu membri de date, care sunt variabile și funcții de membru care sunt legate. Când membrilor datelor li se dau valori, se formează un obiect. Cu toate acestea, un obiect este format într-un proces numit instanțierea. Deoarece o clasă poate duce la valori diferite pentru aceleași variabile membre de date, obiecte diferite pot fi apoi instanțiate din aceeași clasă.

În C ++, un set inutilizabil este o clasă, precum și o hartă inutilizabilă. Când un obiect este instanțiat din setul inutilizabil sau din harta inutilizabilă, obiectul devine structura reală a datelor. Cu setul și structurile de date ale hărții, membrul principal al datelor este o listă. Ei bine, setul și harta formează un grup de containere numite, containere asociative comandate. Setul neordonat și harta neordonată există și ele, dar, din păcate, acestea nu sunt abordate în acest articol.

Crearea unui set sau a unei hărți:

Instanțierea unui set din clasa sa de seturi este crearea unui set; crearea unei hărți din clasa sa de hărți este crearea unei hărți. Obiectului astfel creat i se dă un nume la alegerea programatorului.

Pentru a crea un set, programul ar trebui să înceapă cu:

#include
#include
folosind spațiul de nume std;

Rețineți directiva „#include ”, Care include biblioteca de seturi care are clasa de seturi din care vor fi instanțiate structurile de date setate.

Pentru a crea o hartă, programul ar trebui să înceapă cu:

#include
#include
folosind spațiul de nume std;

Rețineți directiva „#include ”, Care include biblioteca de hărți care are clasa de hărți din care vor fi instanțiate structurile de date ale hărții.

Sintaxa pentru a crea un set gol este:

a stabilit obiectNume

Exemplu:

a stabilit setObj;

Un exemplu pentru a crea un set cu conținut este:

a stabilit setObj (6, 10, 2, 8, 4);

Sintaxa pentru a crea o hartă goală este:

Hartă obiectNume

Exemplu:

Hartă mapObj;

Un exemplu pentru a crea o hartă cu conținut este:

Hartă mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Bazele Iteratorului:

Un iterator este un pointer elaborat, care poate fi folosit pentru a parcurge lista structurii de date de la început până la sfârșit.

Funcția membru begin ()

Funcția de membru begin () returnează un iterator care indică primul element al listei. Următorul exemplu ilustrează acest lucru pentru set:

a stabilit setObj (6, 10, 2, 8, 4);
a stabilit:: iterator iter = setObj.începe();
cout << *iter << '\n';

Rețineți că modul begin () a fost folosit cu setObj și operatorul punct. iter este obiectul iterator returnat. De asemenea, rețineți modul în care a fost declarat. * este operatorul de indirectare. Așa cum este utilizat cu iter, returnează primul element al setului; primul element este 2 în loc de 6 - vezi explicația de mai jos.

Următorul exemplu ilustrează utilizarea funcției begin () pentru hartă:

Hartă mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Hartă:: iterator iter = mapObj.începe();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Rețineți că modul begin () a fost folosit cu mapObj și operatorul punct. iter este obiectul iterator returnat. De asemenea, rețineți modul în care a fost declarat. „Primul”, așa cum este folosit aici, se referă la cheie. „Al doilea” se referă la valoarea corespunzătoare cheii. Observați cum au fost utilizate cu iter pentru a obține componentele elementului de pornire din listă. Primul element este a, 10 în loc de c, 30 - consultați explicația de mai jos.

Funcția membru „begin () const”

Funcția membru „begin () const” returnează un iterator care indică primul element al listei atunci când declarația setului începe cu const (pentru constantă). În această condiție, valoarea din listă, la care se referă iteratorul returnat, nu poate fi modificată de către iterator. Următorul exemplu ilustrează utilizarea acestuia pentru set:

const set setObj (6, 10, 2, 8, 4);
a stabilit:: const_iterator iter = setObj.începe();
cout << *iter << '\n';

Rețineți că modul begin () a fost folosit cu setObj și cu operatorul punct. Nicio „const” nu a fost tastată imediat după begin (). Cu toate acestea, „const” a precedat declarația. iter aici este obiectul iterator constant returnat, care este diferit de iteratorul normal. De asemenea, rețineți modul în care a fost declarat. * este operatorul de indirectare; așa cum este utilizat cu iter, returnează primul element al setului. Primul element este 2 în loc de 6 - vezi explicația de mai jos.

Următorul exemplu ilustrează utilizarea funcției „begin () const” pentru hartă:

harta const mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Hartă:: const_iterator iter = mapObj.începe();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Rețineți că modul begin () a fost folosit cu mapObj și operatorul punct. Nicio „const” nu a fost tastată imediat după begin (). Cu toate acestea, „const” a precedat declarația. iter aici este obiectul constant iterator returnat, care este diferit de iteratorul normal. De asemenea, rețineți modul în care a fost declarat. „Primul”, așa cum este folosit aici, se referă la cheie; „Al doilea”, așa cum este utilizat aici, se referă la valoarea corespunzătoare cheii. Observați cum au fost utilizate cu iter pentru a obține componentele elementului de pornire din listă. Primul element este a, 10 în loc de c, 30 - consultați explicația de mai jos.

Funcția membrului end ()

Funcția end () membru returnează un iterator care indică imediat după sfârșitul listei. Următorul exemplu ilustrează acest lucru pentru set:

a stabilit setObj (6, 10, 2, 8, 4);
a stabilit:: iterator iter = setObj.Sfârșit();
cout << *iter << '\n';

Rețineți că modul end () a fost utilizat cu setObj și operatorul punct. iter este obiectul iterator returnat. De asemenea, rețineți modul în care a fost declarat. * este operatorul de indirectare; așa cum este utilizat cu iter, returnează ultimul + 1 element al setului. În computerul autorului, acest ultim element + 1 este 5, care nu se află pe listă. Deci, aveți grijă să nu folosiți acest element.

Următorul exemplu ilustrează utilizarea funcției end () pentru hartă:

Hartă mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Hartă:: iterator iter = mapObj.Sfârșit();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Rețineți că modul end () a fost utilizat cu mapObj și operatorul punct. iter este obiectul iterator returnat. De asemenea, rețineți modul în care a fost declarat. * este operatorul de indirectare; așa cum este utilizat cu iter, returnează ultimul + 1 element al hărții. În computerul autorului, acest ultim element +1 este , 0, care nu se află în listă. Deci, aveți grijă să nu folosiți acest element.

Funcția membru „end () const”

Funcția membru „end () const” returnează un iterator care indică imediat după sfârșitul listei când declarația setului începe cu const (pentru constantă). În această condiție, valoarea din listă, la care se referă iteratorul returnat, nu poate fi modificată de iterator. Următorul exemplu ilustrează utilizarea acestuia pentru set:

const set setObj (6, 10, 2, 8, 4);
a stabilit:: const_iterator iter = setObj.Sfârșit();
cout << *iter << '\n';

Rețineți că modul end () a fost utilizat cu setObj și operatorul punct. Nicio „const” nu a fost tastată imediat după sfârșit (). Cu toate acestea, „const” a precedat declarația. iter este obiectul iterator returnat. De asemenea, rețineți modul în care a fost declarat. * este operatorul de indirectare; așa cum este utilizat cu iter, returnează ultimul + 1 element al setului.

Următorul exemplu ilustrează utilizarea funcției „end () const” pentru hartă:

harta const mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
Hartă:: const_iterator iter = mapObj.Sfârșit();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Rețineți că modul end () a fost utilizat cu mapObj și operatorul punct. Nicio „const” nu a fost tastată imediat după sfârșit (). Cu toate acestea, „const” a precedat declarația. iter este obiectul constant iterator returnat, care este diferit de iteratorul normal. De asemenea, observați cu atenție modul în care a fost declarat.

Acces element pentru set și hartă:

A stabilit

Cu setul, elementul este citit folosind operatorul de indirectare. Primele două elemente ale unui set sunt citite în următorul exemplu:

a stabilit setObj (6, 10, 2, 8, 4);
a stabilit:: iterator iter = setObj.începe();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Ieșirea este 2, apoi urmată de 4 - vezi explicația de mai jos. Pentru a indica următorul element al listei, iteratorul este incrementat.

Notă: Un element nu poate fi schimbat folosind operatorul de indirectare pentru set. De exemplu, „* iter = 9;” nu e posibil.

Hartă

O hartă constă din perechi cheie / valoare. O valoare poate fi citită folosind cheia corespunzătoare și modificată folosind aceeași cheie. Următorul segment de cod ilustrează acest lucru:

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

Ieșirea este:

20
55

Operatorul punct nu a fost folosit aici. În schimb, a fost utilizat operatorul parantezelor pătrate, care ia cheia drept conținut.

Ordinea elementelor dintr-un set sau hartă:

Elementele pot fi inserate într-un set, în orice ordine. Cu toate acestea, odată introdus, setul își rearanjează elementele în ordine crescătoare. Ordinea crescătoare este comanda implicită. Dacă este necesară o ordine descrescătoare, atunci setul trebuie declarat ca în exemplul următor:

a stabilit > setObj (6, 10, 2, 8, 4);

Deci, după tip, e.g., int, pentru șablon, există o virgulă, urmată de „mai mare”În paranteze unghiulare.

Elementele pot fi inserate într-o hartă în orice ordine. Cu toate acestea, odată inserată, harta își rearanjează elementele în ordine crescătoare după cheie (numai), menținând în același timp relația dintre fiecare cheie și valoarea acesteia. Ordinea crescătoare este comanda implicită; dacă este necesară o ordine descrescătoare, atunci harta trebuie declarată ca în exemplul următor:

Hartă > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Deci, după perechea de tipuri, e.g., „Char, int”, pentru șablon, există o virgulă, urmată de „mai mare”În paranteze unghiulare.

Traversând un set

Bucla while sau for-loop cu iteratorul poate fi folosită pentru a traversa un set. Următorul exemplu folosește o buclă for pentru a traversa un set care a fost configurat în ordine descrescătoare:

a stabilit > setObj (6, 10, 2, 8, 4);
pentru (set:: iterator iter = setObj.începe(); iter != setObj.Sfârșit(); ++ iter)

cout << *iter << ";

Ieșirea este:

10 8 6 4 2

Incrementarea unui iterator îl îndreaptă către următorul element.

Parcurgerea unei hărți

Bucla while sau for-loop cu iteratorul poate fi utilizată pentru a traversa o hartă. Următorul exemplu folosește o buclă for pentru a traversa o hartă care a fost configurată în ordine descrescătoare:

Hartă > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
pentru (harta:: iterator iter = mapObj.începe(); iter != mapObj.Sfârșit(); ++ iter)

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

Ieșirea este:

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

Incrementarea unui iterator îl îndreaptă către următorul element. „Primul”, în cod, se referă la cheie și „al doilea” se referă la valoarea corespunzătoare. Rețineți cum au fost obținute aceste valori pentru ieșire.

Alte funcții de membru utilizate frecvent:

Funcția size ()

Această funcție returnează un număr întreg, care este numărul de elemente din listă. Setați un exemplu:

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

Ieșirea este de 5.

Exemplu de hartă:

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

Ieșirea este de 5.

Funcția insert ()

a stabilit

setul nu permite duplicarea. Deci, orice duplicat inserat este respins în tăcere. Cu setul, argumentul pentru funcția insert () este valoarea care trebuie inserată. Valoarea este montată într-o poziție, în care ordinea din set rămâne ascendentă sau descendentă. Exemplu:

a stabilit setObj (6, 10, 2, 8, 4);
setObj.inserție (6);
setObj.inserție (9);
setObj.inserție (12);
pentru (set:: iterator iter = setObj.începe(); iter != setObj.Sfârșit(); ++ iter)

cout << *iter << ";

Ieșirea este:

2 4 6 8 9 10 12

Notă: Funcția de membru insert () poate fi utilizată pentru a popula un set gol.

Hartă

harta nu permite duplicarea cheii. Deci, orice duplicat inserat este respins în tăcere. Cu harta, argumentul pentru funcția insert () este perechea cheie / valoare în paranteze. Elementul este montat într-o poziție prin tastă, în care ordinea de pe hartă rămâne ascendentă sau descendentă. Exemplu:

Hartă mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.inserare ('e', 80);
mapObj.inserare ('f', 50);
mapObj.inserare ('g', 60);
pentru (harta:: iterator iter = mapObj.începe(); iter != mapObj.Sfârșit(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Ieșirea este:

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

Notă: Funcția de membru insert () poate fi utilizată pentru a popula o hartă goală.

Funcția goală ()

Această funcție returnează adevărat dacă lista este goală și falsă în caz contrar. Setați un exemplu:

a stabilit setObj (6, 10, 2, 8, 4);
bool ret = setObj.gol();
cout << ret << '\n';

Ieșirea este 0 pentru fals, ceea ce înseamnă că setul de aici nu este gol.

Exemplu de hartă:

Hartă mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapObj.gol();
cout << ret << '\n';

Ieșirea este 0 pentru fals, ceea ce înseamnă că harta de aici nu este goală.

Funcția șterge ()

a stabilit

Luați în considerare următorul segment de cod:

a stabilit setObj (10, 20, 30, 40, 50);
a stabilit:: iterator iter = setObj.începe();
a stabilit:: iterator itr = setObj.șterge (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.șterge (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Ieșirea este:

noua dimensiune: 4
următoarea valoare: 20
noua dimensiune: 3
următoarea valoare: 30

Funcția erase () ia un iterator care indică un element ca argument. După ștergerea elementului, funcția erase () returnează un iterator care indică următorul element.

Hartă

Luați în considerare următorul segment de cod:

Hartă mapObj ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
Hartă:: iterator iter = mapObj.începe();
Hartă:: iterator itr = mapObj.șterge (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapObj.șterge (itr);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

Ieșirea este:

noua dimensiune: 4
următoarea pereche de valori: b, 20
noua dimensiune: 3
următoarea pereche de valori: c, 30

Funcția erase () ia un iterator care indică un element ca argument. După ștergerea elementului, funcția erase () returnează un iterator care indică următorul element.

Funcția clear ()

Funcția clear () elimină toate elementele din listă. Exemplu:

a stabilit setObj (6, 10, 2, 8, 4);
setObj.clar();
cout << setObj.size() << '\n';

Ieșirea este 0.

exemplu de hartă:

Hartă mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.clar();
cout << mapObj.size() << '\n';

Ieșirea este 0.

Concluzie:

O structură de date setată în C ++ este o structură în care lista elementelor este stocată în mod implicit în ordine crescătoare sau în ordine descrescătoare la alegerea programatorului. Toate elementele setului sunt unice. O structură de date de hartă în C ++ este o structură în care lista este un hash de perechi cheie / valoare, stocate în ordine crescătoare de taste în mod implicit sau în ordine descrescătoare de taste după alegerea programatorului. Cheile sunt, de asemenea, unice și pot exista valori duplicate. Principalul membru al datelor din oricare dintre structuri este lista. Oricare dintre structuri are funcții de membru, dintre care unele sunt frecvent utilizate.

Mouse left-click button not working on Windows 10
If you are using a dedicated mouse with your laptop, or desktop computer but the mouse left-click button is not working on Windows 10/8/7 for some rea...
Cursor jumps or moves randomly while typing in Windows 10
If you find that your mouse cursor jumps or moves on its own, automatically, randomly while typing in Windows laptop or computer, then some of these s...
How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...