C ++

Jedinstveni i uređeni spremnici na C ++

Jedinstveni i uređeni spremnici na C ++
6, 10, 2, 8, 4 je skup; 2, 4, 6, 8, 10 skup je istih cijelih brojeva, poredanih uzlaznim redoslijedom. U matematici skup ima jedinstvene elemente (različite elemente), odnosno, nijedan se element ne pojavljuje više puta. Nadalje, multiset je skup u kojem se bilo koji element može pojaviti više puta. 6, 6, 10, 2, 2, 8, 4, 4, 4 je višestruki skup. 2, 2, 4, 4, 4, 6, 6, 8, 10 isti je multiset, ali s elementima poredanim u rastućem redoslijedu. Ovaj se članak ne bavi multisetom. Bavi se C ++ strukturom podataka koja se naziva set.

Mapa u softveru je poput niza, ali to je niz s dva stupca umjesto jednog. Prvi stupac ima ključeve, a drugi stupac vrijednosti. Svaki redak je jedan par, čineći par ključ / vrijednost. Ključ je izravno povezan s njegovom vrijednošću.

Primjer karte je 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. Prvi ovdje ubačeni par ključ / vrijednost je 'c', 3, gdje je 'c' ključ, a 30 vrijednost. Ova karta nije poredana ključevima. Poredak ove karte po ključevima daje 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Primijetite da mogu biti duplicirane vrijednosti, ali ne i duplicirani ključevi. Uređena karta je karta poredana tipkama.

Multiset je skupu, kao što je multimap karta. To znači da postoje karte s dupliciranim ključevima. Primjer višekarata je 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. I kao što je gore rečeno, ovaj se članak ne bavi multimapima, već se bavi C ++ strukturom podataka koja se naziva map.

U C ++-u struktura podataka je struktura sa svojstvima (članovi podataka) i metodama (funkcije člana). Podaci strukture su popis; set je popis; karta je popis parova ključ / vrijednost.

Ovaj članak raspravlja o osnovama skupova i karata na jeziku C ++, a da bi čitatelj bolje razumio ovaj članak, čitatelj je trebao imati osnovno znanje o jeziku C++.

Sadržaj članka:

Klasa i njezini objekti:

U C ++-u skup, karta i druge slične strukture nazivaju se spremnici. Klasa je generalizirana jedinica s članovima podataka, koji su varijable, i funkcijama člana koje su povezane. Kada se članovima podataka daju vrijednosti, formira se objekt. Međutim, objekt se formira u procesu koji se naziva instancijacija. Kako klasa može dovesti do različitih vrijednosti za iste varijable člana podataka, tada se iz iste klase mogu instancirati različiti objekti.

U C ++-u neupotrebljiv skup je klasa, kao i neupotrebljiva karta. Kad se objekt instancira iz neupotrebljivog skupa ili neupotrebljive karte, objekt postaje stvarna struktura podataka. Uz strukturu podataka skupa i mape, glavni član podataka je popis. Pa, skup i karta tvore skupinu spremnika koji se nazivaju uređeni asocijativni spremnici. Neuređeni skup i neuređena karta također postoje, ali nažalost u ovom se članku o njima ne govori.

Izrada skupa ili karte:

Instanciranje skupa iz njegove klase skupova stvara skup; instanciranje karte iz njezine klase mape stvara mapu. Tako stvoreni objekt dobiva ime po izboru programera.

Da bi stvorio set, program treba započeti sa:

#include
#include
pomoću prostora imena std;

Obratite pažnju na direktivu „#include ”, Koja uključuje biblioteku skupova koja ima klasu skupova iz koje će se instancirati skupove podataka.

Kako bi stvorio kartu, program treba započeti sa:

#include
#include
pomoću prostora imena std;

Obratite pažnju na direktivu „#include ”, Koja uključuje biblioteku mapa koja ima klasu karte iz koje će se instancirati strukture podataka mape.

Sintaksa za stvaranje praznog skupa je:

postavljen objectName

Primjer:

postavljen setObj;

Primjer za izradu skupa sa sadržajem je:

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

Sintaksa za stvaranje prazne karte je:

karta objectName

Primjer:

karta mapObj;

Primjer za stvaranje mape sa sadržajem je:

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

Osnove iteratora:

Iterator je razrađeni pokazivač koji se može koristiti za prelazak popisa strukture podataka od početka do kraja.

Funkcija člana begin ()

Funkcija člana begin () vraća iterator koji pokazuje na prvi element popisa. Sljedeći primjer to ilustrira za set:

postavljen setObj (6, 10, 2, 8, 4);
postavljen:: iterator iter = setObj.početi();
cout << *iter << '\n';

Obratite pažnju na način na koji se koristi begin () s setObj i operatorom točke. iter je vraćeni objekt iteratora. Također, imajte na umu način na koji je proglašen. * je indirektni operator. Kao što se koristi s iter, vraća prvi element skupa; prvi je element 2 umjesto 6 - vidi objašnjenje u nastavku.

Sljedeći primjer ilustrira upotrebu funkcije begin () za kartu:

karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
karta:: iterator iter = mapObj.početi();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Obratite pažnju na način na koji se koristi begin () s mapObj i operatorom točke. iter je vraćeni objekt iteratora. Također, imajte na umu način na koji je proglašen. "Prvo", kako se ovdje koristi, odnosi se na ključ. "Drugi" odnosi se na vrijednost koja odgovara ključu. Uočite kako su korišteni s iterom za dobivanje početnih komponenata popisa. Prvi je element a, 10 umjesto c, 30 - pogledajte objašnjenje u nastavku.

Funkcija člana „begin () const“

Funkcija člana „begin () const“ vraća iterator koji pokazuje na prvi element popisa kada deklaracija skupa započinje const (za konstantu). Pod tim uvjetom, iterator ne može promijeniti vrijednost na popisu na koju se poziva vraćeni iterator. Sljedeći primjer ilustrira njegovu upotrebu za set:

const set setObj (6, 10, 2, 8, 4);
postavljen:: const_iterator iter = setObj.početi();
cout << *iter << '\n';

Obratite pažnju na način na koji se koristi begin () s setObj i operatorom točke. Nijedna "const" nije upisana odmah nakon start (). Međutim, "const" je prethodio deklaraciji. ovdje je vraćeni objekt konstantnog iteratora, koji se razlikuje od normalnog iteratora. Također, imajte na umu način na koji je proglašen. * je indirektni operator; kao što se koristi s iter, vraća prvi element skupa. Prvi je element 2 umjesto 6 - pogledajte objašnjenje u nastavku.

Sljedeći primjer ilustrira upotrebu funkcije “begin () const” za kartu:

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

Obratite pažnju na način na koji se koristi begin () s mapObj i operatorom točke. Nijedna "const" nije upisana odmah nakon start (). Međutim, "const" je prethodio deklaraciji. ovdje je vraćeni objekt konstantnog iteratora, koji se razlikuje od normalnog iteratora. Također, imajte na umu način na koji je proglašen. "Prvi", kako se ovdje koristi, odnosi se na ključ; "Drugi", kako se ovdje koristi, odnosi se na vrijednost koja odgovara ključu. Uočite kako su korišteni s iterom za dobivanje početnih komponenata popisa. Prvi je element a, 10 umjesto c, 30 - pogledajte objašnjenje u nastavku.

Krajnji () član Funkcija

Funkcija člana end () vraća iterator koji pokazuje neposredno nakon kraja popisa. Sljedeći primjer to ilustrira za set:

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

Obratite pažnju na način na koji se end () koristio s setObj i operatorom točke. iter je vraćeni objekt iteratora. Također, imajte na umu način na koji je proglašen. * je indirektni operator; kao što se koristi s iter, vraća zadnji + 1 element skupa. Na autorskom računalu ovaj zadnji + 1 element je 5, što nije na popisu. Dakle, pripazite da ne koristite ovaj element.

Sljedeći primjer ilustrira upotrebu funkcije end () za kartu:

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

Obratite pažnju na način na koji je end () korišten s mapObj i operatorom točke. iter je vraćeni objekt iteratora. Također, imajte na umu način na koji je proglašen. * je indirektni operator; kao što se koristi s iter, vraća zadnji + 1 element karte. Na autorskom računalu ovaj zadnji +1 element je , 0, što nije na popisu. Dakle, pripazite da ne koristite ovaj element.

Funkcija člana „end () const“

Funkcija člana "end () const" vraća iterator koji pokazuje neposredno nakon kraja popisa kada deklaracija skupa započinje const (za konstantu). Pod tim uvjetom, iterator ne može promijeniti vrijednost na popisu na koju se poziva vraćeni iterator. Sljedeći primjer ilustrira njegovu upotrebu za set:

const set setObj (6, 10, 2, 8, 4);
postavljen:: const_iterator iter = setObj.kraj();
cout << *iter << '\n';

Obratite pažnju na način na koji se end () koristio s setObj i operatorom točke. Nijedna "const" nije upisana neposredno nakon kraja (). Međutim, "const" je prethodio deklaraciji. iter je vraćeni objekt iteratora. Također, imajte na umu način na koji je proglašen. * je indirektni operator; kao što se koristi s iter, vraća zadnji + 1 element skupa.

Sljedeći primjer ilustrira upotrebu funkcije "end () const" za kartu:

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

Obratite pažnju na način na koji je end () korišten s mapObj i operatorom točke. Nijedna "const" nije upisana neposredno nakon kraja (). Međutim, "const" je prethodio deklaraciji. iter je vraćeni objekt konstantnog iteratora, koji se razlikuje od normalnog iteratora. Također, pažljivo promatrajte način na koji je proglašen.

Pristup elementima za set i kartu:

Postavi

S setom se element čita pomoću indirektnog operatora. Prva dva elementa skupa čitaju se u sljedećem primjeru:

postavljen setObj (6, 10, 2, 8, 4);
postavljen:: iterator iter = setObj.početi();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

Izlaz je 2, a zatim slijedi 4 - pogledajte objašnjenje u nastavku. Za usmjeravanje na sljedeći element popisa, iterator se povećava.

Napomena: Element se ne može promijeniti pomoću indirektnog operatora za skup. Na primjer, "* iter = 9;" nije moguće.

karta

Karta se sastoji od parova ključ / vrijednost. Vrijednost se može pročitati pomoću odgovarajućeg ključa i promijeniti pomoću istog ključa. Sljedeći segment koda to ilustrira:

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

Izlaz je:

20
55

Operator točke ovdje nije korišten. Umjesto toga, korišten je operator uglatih zagrada koji uzima ključ kao sadržaj.

Redoslijed elemenata u skupu ili mapi:

Elementi se mogu umetnuti u skup bilo kojim redoslijedom. Međutim, nakon što je umetnut, skup preuređuje svoje elemente u rastućem redoslijedu. Uzlazni poredak zadani je poredak. Ako je potreban silazni poredak, tada se skup mora deklarirati kao u sljedećem primjeru:

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

Dakle, nakon tipa, npr.g., int, za predložak postoji zarez iza kojeg slijedi „veći”U kutnim zagradama.

Elementi se mogu umetnuti u kartu bilo kojim redoslijedom. Međutim, nakon što je umetnuta, karta raspoređuje svoje elemente u uzlaznom redoslijedu po ključu (samo) zadržavajući odnos između svakog ključa i njegove vrijednosti. Uzlazni poredak je zadani nalog; ako je potreban silazni poredak, tada se karta mora deklarirati kao u sljedećem primjeru:

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

Dakle, nakon para tipova, npr.g., “Char, int”, za predložak stoji zarez, a iza njega slijedi “veći”U kutnim zagradama.

Prelazak skupa

Dok-petlja ili for-petlja s iteratorom mogu se koristiti za prelazak skupa. Sljedeći primjer koristi for-loop za prelazak skupa koji je konfiguriran u padajućem redoslijedu:

postavljen > setObj (6, 10, 2, 8, 4);
za (skup:: iterator iter = setObj.početi(); iter != setObj.kraj(); ++ iter)

cout << *iter << ";

Izlaz je:

10 8 6 4 2

Inkrementiranje iteratora usmjerava ga na sljedeći element.

Obilazak karte

Dok-petlja ili for-petlja s iteratorom mogu se koristiti za prelazak karte. Sljedeći primjer koristi for-loop za prelazak mape koja je konfigurirana u opadajućem redoslijedu:

karta > mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
za (karta:: iterator iter = mapObj.početi(); iter != mapObj.kraj(); ++ iter)

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

Izlaz je:

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

Inkrementiranje iteratora usmjerava ga na sljedeći element. "Prvo", u kodu, odnosi se na ključ, a "drugo" odnosi se na odgovarajuću vrijednost. Imajte na umu kako su te vrijednosti dobivene za izlaz.

Ostale često korištene funkcije člana:

Veličina () Funkcija

Ova funkcija vraća cijeli broj, što je broj elemenata na popisu. Postavite primjer:

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

Izlaz je 5.

Primjer karte:

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

Izlaz je 5.

Funkcija insert ()

postavljen

set ne dopušta dupliciranje. Dakle, svaki umetnuti duplikat se tiho odbacuje. S setom, argument funkcije insert () vrijednost je koju treba umetnuti. Vrijednost se postavlja u položaj u kojem redoslijed u skupu ostaje uzlazno ili silazno. Primjer:

postavljen setObj (6, 10, 2, 8, 4);
setObj.umetak (6);
setObj.umetak (9);
setObj.umetak (12);
za (skup:: iterator iter = setObj.početi(); iter != setObj.kraj(); ++ iter)

cout << *iter << ";

Izlaz je:

2 4 6 8 9 10 12

Napomena: Funkcija člana insert () može se koristiti za popunjavanje praznog skupa.

karta

karta ne dopušta dupliciranje po ključu. Dakle, svaki umetnuti duplikat se tiho odbacuje. S mapom je argument funkcije insert () par ključ / vrijednost u zagradama. Element se postavlja ključem u položaj u kojem redoslijed na karti ostaje uzlazan ili silazan. Primjer:

karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.umetak ('e', 80);
mapObj.umetak ('f', 50);
mapObj.umetak ('g', 60);
za (karta:: iterator iter = mapObj.početi(); iter != mapObj.kraj(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

Izlaz je:

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

Napomena: Funkcija člana insert () može se koristiti za popunjavanje prazne karte.

Funkcija empty ()

Ova funkcija vraća true ako je popis prazan, a false ako je drugačije. Postavite primjer:

postavljen setObj (6, 10, 2, 8, 4);
bool ret = setObj.prazan();
cout << ret << '\n';

Izlaz je 0 za false, što znači da ovdje nije prazan.

Primjer karte:

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

Izlaz je 0 za false, što znači da karta ovdje nije prazna.

Funkcija brisanja ()

postavljen

Razmotrite sljedeći segment koda:

postavljen setObj (10, 20, 30, 40, 50);
postavljen:: iterator iter = setObj.početi();
postavljen:: iterator itr = setObj.izbrisati (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setObj.izbrisati (itr);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

Izlaz je:

nova veličina: 4
sljedeća vrijednost: 20
nova veličina: 3
sljedeća vrijednost: 30

Funkcija erase () uzima iterator koji ukazuje na element kao argument. Nakon brisanja elementa, funkcija erase () vraća iterator koji pokazuje na sljedeći element.

karta

Razmotrite sljedeći segment koda:

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

Izlaz je:

nova veličina: 4
sljedeći par vrijednosti: b, 20
nova veličina: 3
sljedeći par vrijednosti: c, 30

Funkcija erase () uzima iterator koji ukazuje na element kao argument. Nakon brisanja elementa, funkcija erase () vraća iterator koji pokazuje na sljedeći element.

Funkcija clear ()

Funkcija clear () uklanja sve elemente s popisa. Postavite primjer:

postavljen setObj (6, 10, 2, 8, 4);
setObj.čisto();
cout << setObj.size() << '\n';

Izlaz je 0.

primjer karte:

karta mapObj ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapObj.čisto();
cout << mapObj.size() << '\n';

Izlaz je 0.

Zaključak:

Postavljena podatkovna struktura u C ++ je struktura u kojoj se popis elemenata prema zadanim postavkama pohranjuje u rastućem redoslijedu ili u opadajućem redoslijedu po izboru programera. Svi elementi seta su jedinstveni. Struktura podataka karte u C ++ je struktura u kojoj je popis hash parova ključ / vrijednost, koji su prema zadanim postavkama pohranjeni u rastućem redoslijedu ili u padajućem redoslijedu po izboru programera. Ključevi su također jedinstveni i mogu biti duplicirane vrijednosti. Glavni član podataka bilo koje od struktura je popis. Bilo koja struktura ima funkcije člana, od kojih su neke uobičajeno korištene.

5 najboljih arkadnih igara za Linux
U današnje vrijeme računala su ozbiljni strojevi koji se koriste za igre na sreću. Ako ne uspijete dobiti novi visoki rezultat, znat ćete na što misli...
Bitka za Wesnoth 1.13.6 Razvoj objavljen
Bitka za Wesnoth 1.13.6 objavljeno prošlog mjeseca, šesto je razvojno izdanje u izdanju 1.13.x series i donosi niz poboljšanja, ponajviše korisničkog ...
Kako instalirati League Of Legends na Ubuntu 14.04
Ako ste ljubitelj League of Legends, ovo je prilika za vas da testirate League of Legends. Imajte na umu da je LOL podržan na PlayOnLinux ako ste kori...