Kaart sisse C++ Standardmalliteek (STL)

โšก Nutikas kokkuvรตte

Kaart sisse C++ on standardmallide teegi assotsiatiivne konteiner, mis salvestab elemente sorteeritud vรตtme-vรครคrtuse paaridena, kus iga unikaalne vรตti vastab รผhele vรครคrtusele ning vรตimaldab kiiret otsingut, sisestamist ja jรคrjestatud lรคbimist.

  • ๐Ÿ—บ๏ธ Assotsiatiivne konteiner: A C++ map salvestab รผksused vรตtme-vรครคrtuse paaridena, millel on unikaalsed, automaatselt sorteeritud vรตtmed.
  • ๐Ÿงฉ Pรคis ja sรผntaks: Lisa kaardi pรคis ja seejรคrel deklareeri std::map nimi tรผรผppaaride salvestamiseks.
  • ๐Ÿ› ๏ธ Sisseehitatud funktsioonid: Kaardi sisu haldamiseks sobivad funktsioonid begin(), size(), empty(), insert(), find(), erase() ja clear().
  • ๐Ÿ”„ Kordamine: Kahesuunaline iteraator liigutab kaardielemente lugemiseks vรตi kustutamiseks sorteeritud vรตtmete jรคrjekorras.
  • ๐Ÿ”‘ Unikaalsed vรตtmed: Kaks elementi ei saa jagada vรตtit, mis teeb kaardi ideaalseks assotsiatiivse massiivina.
  • ๐Ÿค– AI abi: GitHub Copilot ja sarnased tehisintellekti assistendid loovad lรผhikese kommentaari pรตhjal kaardideklaratsioonid ja -tsรผklid.

Kaart sisse C++ STL

Milles on kaart C++?

In C++, MAP on assotsiatiivne konteiner, mis salvestab elemente kaardistatud kujul. Iga kaardi element koosneb vรตtmevรครคrtusest ja kaardistatud vรครคrtusest. Kahel kaardistatud vรครคrtusel ei saa olla samu vรตtmevรครคrtusi.

Vรตtmevรครคrtused on kasulikud elementide sortimiseks ja unikaalseks tuvastamiseks, samas kui kaardistatud vรครคrtused salvestavad iga vรตtmega seotud sisu. Need kaks vรตivad tรผรผbi poolest erineda, kuid liikmetรผรผp รผhendab need paariks, mis sisaldab mรตlemat.

Enne mis tahes koodi kirjutamist on kasulik teada, miks kaart on sageli รตige konteiner, mille poole haarata.

Miks kasutada std::map?

Kaardi kasutamise pรตhjused on jรคrgmised:

  • std::map salvestab ainult unikaalseid vรตtmeid, sorteeritud jรคrjekorras vastavalt valitud sortimiskriteeriumidele.
  • Vรตtme abil on elementide otsimine lihtne ja kiire.
  • Igale vรตtmele on kinnitatud ainult รผks element.
  • std::map saab kasutada assotsiatiivse massiivina.
  • std::map on rakendatav tasakaalustatud binaarpuude abil.

Nende eeliste kasutamiseks alustage deklaratsiooni sรผntaksiga.

Sรผntaks

Std::map deklareerimiseks kasutage jรคrgmist sรผntaksit:

std::map<key_datatype, value_datatype>map_name; 
  • . vรตtme_andmetรผรผp tรคhistab kaardivรตtmete andmetรผรผpi.
  • . vรครคrtuse_andmetรผรผp tรคhistab kaardivรตtmetele vastavate vรครคrtuste andmetรผรผpi.
  • . kaardi_nimi on kaardi nimi.

Nรคiteks:

map<string, int> my_map; 

Me deklareerisime kaardi nimega my_map. Kaardil on vรตtme andmetรผรผbiks string ja vรครคrtuste andmetรผรผbiks tรคisarv.

Liikmete tรผรผbid

Liikmesfunktsioonid saavad parameetrite vรตi tagastustรผรผbina kasutada jรคrgmisi liikmetรผรผpe:

  • key_type: Vรตti (malli esimene parameeter)
  • mapped_type: T (malli teine โ€‹โ€‹parameeter)
  • key_compare: Vรตrdle (malli kolmas parameeter)
  • allokaatori_tรผรผp: Alloc (malli neljas parameeter)
  • vรครคrtuse_tรผรผp: paar
  • value_compare: Pesastatud funktsiooniklass elementide vรตrdlemiseks
  • viide: allocator_type::reference
  • const_reference: allocator_type::const_reference
  • pointer: allocator_type::pointer
  • const_pointer: allocator_type::const_pointer
  • iteraator: vรครคrtuse_tรผรผpi kahesuunaline iteraator
  • const_iterator: kahesuunaline iteraator vรครคrtusele const value_type
  • reverse_iterator: vastupidine iteraator
  • const_reverse_iterator: pidev tagurpidi iteraator
  • erinevus_tรผรผp: ptrdiff_t
  • size_type: suurus_t

Std::map sisseehitatud funktsioonid

std::kaardil on sisseehitatud funktsioonid. Mรตned neist hรตlmavad jรคrgmist:

  • algama () โ€“ See funktsioon tagastab iteraatori kaardi esimesele elemendile.
  • suurus () โ€“ See funktsioon tagastab kaardil olevate elementide arvu.
  • tรผhi() โ€“ See funktsioon tagastab Boole'i โ€‹โ€‹vรครคrtuse, mis nรคitab, kas kaart on tรผhi.
  • sisesta(paar(vรตti, vรครคrtus)) โ€“ See funktsioon lisab kaardile uue vรตtme-vรครคrtuse paari.
  • leid(vรครคrtus) โ€“ See funktsioon annab elemendile val iteraatori, kui see leitakse. Vastasel juhul tagastab see m.end().
  • kustutada(iteraatori positsioon) โ€“ See funktsioon kustutab iteraatori poolt osutatud positsioonilt pรคrit elemendi.
  • kustuta (konst g) โ€“ See funktsioon kustutab kaardilt vรตtme-vรครคrtuse g.
  • selge () โ€“ See funktsioon kustutab kaardilt kรตik elemendid.

Kui funktsioonid on defineeritud, rakendavad jรคrgmised nรคited neid, alustades iteratsioonist.

Itereerimine รผle kaardielementide

Saate kaardi elemente itereerida. Peame lihtsalt looma iteraatori ja seda selleks kasutama. Nรคiteks:

Nรคiteks 1

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

Vรคljund:

C++ kaardi iteratsiooni nรคide 1 vรคljund

Siin on koodi ekraanipilt:

C++ kaardi iteratsiooni nรคite 1 kood

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie koodi iostreami pรคisefail.
  2. Selle funktsioonide kasutamiseks lisage meie koodi stringi pรคise fail.
  3. Kaasake kaardi pรคise fail meie koodi, et kasutada selle funktsioone.
  4. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  5. Kutsuge funktsioon main(). { tรคhistab funktsiooni keha algust.
  6. Looge kaart nimega ร•pilased, kus vรตtmeteks on tรคisarvud ja vรครคrtusteks stringid.
  7. Sisestage vรครคrtused kaardile ร•pilased. Vรตti 200 ja Alice'i vรครคrtus sisestatakse kaardile.
  8. Sisestage vรครคrtused kaardile ร•pilased. Kaardile lisatakse vรตti 201 ja Johni vรครคrtus.
  9. Kasuta funktsiooni size(), et saada kaardi nimega Students suurus. See peaks tagastama vรครคrtuse 2.
  10. Printige konsoolile teksti.
  11. Kasutage for-silmust, et luua iteraator nimega see, et itereerida รผle kaardi elemente nimega ร•pilased.
  12. Printige konsoolile kaardi ร•pilased vรครคrtused.
  13. For-silmuse keha lรตpp.
  14. Funktsiooni main() keha lรตpp.

Andmete sisestamine kausta std::map

Saate elemente std::map-i sisestada funktsiooni insert() abil. Pidage meeles, et std::map vรตtmed peavad olema unikaalsed.

Seega kontrollib see kรตigepealt, kas iga vรตti on kaardil olemas. Kui see on olemas, siis kirjet ei lisata, vaid tagastatakse olemasoleva kirje iteraator. Kui seda pole, siis kirje lisatakse.

Funktsioonil on jรคrgmised variatsioonid:

  • sisesta(paar) โ€“ selle variatsiooni korral lisatakse kaardile vรตtme-vรครคrtuse paar.
  • sisesta(algus_vรครคrtus, lรตpp_vรครคrtus) โ€“ selle variatsiooni korral lisatakse kirjed teiselt kaardilt start_itr ja end_itr poolt mรครคratud vahemikku.

Funktsioon insert_or_assign() tรถรถtab samamoodi nagu funktsioon insert(), aga kui antud vรตti on kaardil juba olemas, siis selle vรครคrtust muudetakse.

Nรคiteks 2

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

Vรคljund:

C++ kaardi lisamise nรคite 2 vรคljund

Siin on koodi ekraanipilt:

C++ kaardi sisestamise nรคite 2 kood

Code Selgitus:

  1. Kaasake kaardi pรคise fail meie koodi, et kasutada selle funktsioone.
  2. Selle funktsioonide kasutamiseks lisage meie koodi iostreami pรคisefail.
  3. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  4. Kutsuge funktsioon main(). { tรคhistab funktsiooni keha algust.
  5. Looge kaart nimega m, kus vรตtmeteks on tรคisarvud ja vรครคrtusteks tรคisarvud. Kaardile on tehtud kolm sissekannet.
  6. Lisa kaardile uus kirje m. Kaardile lisatakse vรตti 5 ja vรครคrtus 6.
  7. Pรผรผab sisestada juba olemasolevasse vรตtmesse. Kuna vรตti 1 on kaardil juba olemas, siis sisestust ei tehta.
  8. Funktsiooni insert_or_assign() kasutamine olemasoleva kirje lisamiseks vรตi muutmiseks. Kuna vรตti 1 on juba olemas, muudetakse selle vรครคrtus 6-ks.
  9. Printige konsoolile teksti. Mรคrk โ€ž\tโ€ loob horisontaalse tรผhiku, samas kui mรคrk โ€ž\nโ€ viib hiirekursori jรคrgmisele reale.
  10. Kasutama silmuse jaoks iteraatori loomiseks nimega itr, et itereerida รผle kaardi elementide nimega m.
  11. Printige konsoolile kaardi m vรครคrtused. Mรคrk โ€œ\tโ€ loob horisontaalse tรผhiku iga klahvi ja sellele vastava vรครคrtuse vahele. Seevastu mรคrk โ€ž\nโ€ viib hiirekursori pรคrast iga iteratsiooni jรคrgmisele reale.
  12. For-silmuse keha lรตpp.
  13. Programm peab pรคrast edukat lรตpetamist tagastama vรครคrtuse.
  14. Funktsiooni main() keha lรตpp.

Otsing kaardil

Funktsiooni find() abil saame otsida kaardil elemente nende vรตtmete jรคrgi. Kui vรตtit ei leita, tagastab funktsioon vรครคrtuse std::map::end. Vastasel juhul tagastatakse otsitava elemendi iteraator.

Nรคiteks 3

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

Vรคljund:

C++ kaardiotsingu otsing Nรคite 3 vรคljund

Siin on koodi ekraanipilt:

C++ kaardiotsingu otsing Nรคide 3 kood

Code Selgitus:

  1. Kaasake iostreami pรคisefail meie koodi, et kasutada selle funktsioone ilma vigadeta.
  2. Kaasake stringi pรคise fail meie koodi, et kasutada selle funktsioone ilma vigadeta.
  3. Kaasake kaardi pรคise fail meie koodi, et kasutada selle funktsioone ilma vigadeta.
  4. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  5. Kutsu vรคlja funktsiooni main(). Mรคrk { tรคhistab funktsiooni main() sisu algust.
  6. Looge kaart nimega ร•pilased, mille vรตtmeteks on tรคisarvud ja vรครคrtuste stringid.
  7. Sisestage vรครคrtused kaardile ร•pilased. Vรตti 200 ja Alice'i vรครคrtus sisestatakse kaardile.
  8. Sisestage vรครคrtused kaardile ร•pilased. Kaardile lisatakse vรตti 201 ja Johni vรครคrtus.
  9. Otsige vรตtmega 201 seotud vรครคrtust.
  10. Kasutage if-lauset, et kontrollida, kas vรตtme vรครคrtus on leitud.
  11. Printige vรตtme vรครคrtus konsoolil mรตne teksti kรตrvale.
  12. Kui-lause pรตhiosa lรตpp.
  13. Funktsiooni main() keha lรตpp.

Andmete kustutamine kaardilt

Vรครคrtuse kaardilt kustutamiseks saame kasutada funktsiooni erase(). Me lihtsalt loome iteraatori, mis osutab kustutatavale elemendile. Seejรคrel edastatakse iteraator funktsioonile erase().

Nรคiteks 4

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

Vรคljund:

C++ kaardi kustutamise kustutamise nรคite 4 vรคljund

Siin on koodi ekraanipilt:

C++ kaardi kustutamise kustutamise nรคide 4 kood

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie koodi iostreami pรคisefail.
  2. Selle funktsioonide kasutamiseks lisage meie koodi stringi pรคise fail.
  3. Kaasake kaardi pรคise fail meie koodi, et kasutada selle funktsioone.
  4. Lisage meie koodi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  5. Kutsu vรคlja funktsiooni main(). Mรคrk { tรคhistab funktsiooni main() sisu algust.
  6. Looge kaart nimega minu_kaart, mille vรตtmeteks on stringid ja vรครคrtusteks tรคisarvud.
  7. Sisesta vรครคrtused kaardile my_map. Kaardile lisatakse lehma vรตti ja vรครคrtus 1.
  8. Sisesta vรครคrtused kaardile my_map. Kassi vรตti ja vรครคrtus 2 lisatakse kaardile.
  9. Lisage vรครคrtus 3 kaardile my_map lรตvi vรตtmega.
  10. Looge iteraator, et itereerida kaardil my_map vรตtmekassi otsimiseks.
  11. Kustutage element, millele iteraator osutas.
  12. Kasutage iteraatorit, et itereerida kaardi my_map elemente algusest lรตpuni.
  13. Printige konsoolil vรคlja kaardi my_map sisu.
  14. Programm peab pรคrast edukat lรตpetamist tagastama vรคljundi.
  15. Funktsiooni main() keha lรตpp.

KKK

std::map hoiab vรตtmed sorteerituna, kasutades isetasakaalustuvat binaarset otsingupuud, mis annab O(log n) tehte. std::unordered_map kasutab rรคsitabelit keskmiste O(1) otsingute jaoks, kuid ei salvesta vรตtmeid kindlas jรคrjekorras. Valige vastavalt oma jรคrjestusvajadustele.

Std::map rakendatakse tavaliselt isetasakaalustuva binaarse otsingupuuna, enamasti punase-musta puuna. See hoiab vรตtmed sorteeritud jรคrjekorras ja garanteerib logaritmilise aja sisestamise, kustutamise ja otsingutoimingute jaoks.

Ei. std::map sisaldab ainult unikaalseid vรตtmeid, seega olemasoleva vรตtme lisamine seda รผle ei kirjuta. Kui on vaja duplikaatvรตtmeid, kasutage std::multimap'i, mis vรตimaldab mitmel elemendil jagada sama vรตtmevรครคrtust.

Vรครคrtuse lugemiseks vรตi mรครคramiseks kasutage funktsiooni map_name[key]; kui vรตti puudub, lisab alamindeksi operaator vaikevรครคrtuse. at() liige viskab puuduvate vรตtmete korral erandi, mis teeb sellest turvalisema valiku.

Edastage kohandatud vรตrdlusnรคitaja kolmanda malli argumendina, nรคiteks std::map >. Suurem vรตrdlusvรครคrtus jรคrjestab vรตtmed kรตrgeimast madalaimani, mitte vaikimisi kasvavas jรคrjekorras.

std::map salvestab vรตtme-vรครคrtuse paare ja otsib vรครคrtusi vรตtme jรคrgi, samas kui std::set salvestab ainult unikaalseid vรตtmeid, millel pole seotud vรครคrtust. Mรตlemad hoiavad elemendid sorteerituna, kuid map seostab andmed iga vรตtmega.

Jah. Tehisintellektiga kodeerimisassistendid muudavad lรผhikese kรคsuviiba vรตi kommentaari toimivaks std::map koodiks, mis sisaldab deklaratsioone, sisestuskรตnesid ja iteraatoritsรผkleid. Enne kompileerimist vaadake alati รผle genereeritud vรตtmetรผรผbid, jรคrjestus ja รครคrmusjuhud.

Jah. GitHubi koopia Soovitab tippimise ajal kaardideklaratsioone, sisestus- ja otsingukรตnesid ning iteratsioonitsรผkleid. See saab korduvate mallisรตnadega hรคsti hakkama, kuigi enne loomist tuleks siiski kontrollida vรตtme unikaalsust ja loogikat.

Vรตta see postitus kokku jรคrgmiselt: