Kartta sisään C++ Standard Template Library (STL)

⚡ Älykäs yhteenveto

Kartta sisään C++ on Standard Template Libraryn assosiatiivinen säilö, joka tallentaa elementit lajiteltuina avain-arvo-pareina, joissa jokainen yksilöllinen avain vastaa yhtä arvoa ja mahdollistaa nopean haun, lisäyksen ja järjestetyn läpikäymisen.

  • 🗺️ Assosiatiivinen säilö: A C++ map tallentaa kohteet avain-arvo-pareina, joilla on yksilölliset, automaattisesti lajitellut avaimet.
  • 🧩 Otsikko ja syntaksi: Sisällytä map-otsikko ja määritä sitten std::map nimi tyypitettyjen parien tallentamiseen.
  • 🛠️ Sisäänrakennetut toiminnot: begin(), size(), empty(), insert(), find(), erase() ja clear() hallitsevat kartan sisältöä.
  • 🔄 Iteraatio: Kaksisuuntainen iteraattori käy läpi karttaelementtejä lajitellussa avainjärjestyksessä lukemista tai poistamista varten.
  • 🔑 Yksilölliset avaimet: Kahdella elementillä ei voi olla samaa avainta, mikä tekee kartasta ihanteellisen assosiatiivisen taulukon.
  • 🤖 AI-apu: GitHub Copilot ja vastaavat tekoälyavustajat rakentavat karttamäärittelyjä ja silmukoita lyhyestä kommentista.

Kartta sisään C++ STL

Mitä kartta sisältää C++?

In C++, MAP on assosiatiivinen säilö, joka tallentaa kohteita kartoitetussa muodossa. Jokainen kartan kohde koostuu avainarvosta ja kartoitetusta arvosta. Kahdella kartoitetulla arvolla ei voi olla samoja avainarvoja.

Avainten arvot ovat hyödyllisiä elementtien lajitteluun ja yksilölliseen tunnistamiseen, kun taas kartoitetut arvot tallentavat kuhunkin avaimeen liittyvän sisällön. Nämä kaksi voivat erota tyypiltään, mutta jäsentyyppi yhdistää ne pariksi, joka sisältää molemmat.

Ennen minkään koodin kirjoittamista on hyödyllistä tietää, miksi kartta on usein oikea säiliö, johon kannattaa tarttua.

Miksi käyttää std::map?

Tässä on syitä kartan käyttöön:

  • std::map tallentaa vain yksilölliset avaimet lajiteltuna valittujen lajittelukriteerien perusteella.
  • Avaimen avulla elementtien etsiminen on helppoa ja nopeaa.
  • Jokaiseen avaimeen on kiinnitetty vain yksi elementti.
  • std::map voidaan käyttää assosiatiivisena taulukkona.
  • std::map on toteutettavissa tasapainotettujen binääripuiden avulla.

Näiden etujen hyödyntämiseksi aloita deklaraatiosyntaksilla.

Syntaksi

Ilmoita std::map käyttämällä tätä syntaksia:

std::map<key_datatype, value_datatype>map_name; 
  • avaintietotyyppi tarkoittaa karttaavainten tietotyyppiä.
  • arvotietotyyppi tarkoittaa karttaavaimia vastaavien arvojen tietotyyppiä.
  • kartan_nimi on kartan nimi.

Esimerkiksi:

map<string, int> my_map; 

Esittelimme kartan nimeltä my_map. Kartan avaintietotyyppi on merkkijono ja arvotietotyyppi kokonaisluku.

Jäsentyypit

Jäsenfunktiot voivat käyttää seuraavia jäsentyyppejä joko parametreina tai paluutyyppinä:

  • key_type: Avain (mallin ensimmäinen parametri)
  • mapped_type: T (mallin toinen parametri)
  • key_compare: Vertaa (mallin kolmas parametri)
  • allocator_type: Alloc (mallin neljäs parametri)
  • arvon tyyppi: pari
  • value_compare: Sisäkkäinen funktioluokka elementtien vertailua varten
  • viite: allokaattorin_tyyppi::viite
  • const_reference: allocator_type::const_reference
  • osoitin: allokaattorin_tyyppi::osoitin
  • const_pointer: allocator_type::const_pointer
  • iteraattori: arvo_tyypin kaksisuuntainen iteraattori
  • const_iterator: kaksisuuntainen iteraattori arvoon const value_type
  • reverse_iterator: käänteinen iteraattori
  • const_reverse_iterator: jatkuva käänteinen iteraattori
  • different_type: ptrdiff_t
  • Koko Tyyppi: int

std::map:n sisäänrakennetut toiminnot

std::map sisältää sisäänrakennetut toiminnot. Jotkut näistä sisältävät:

  • alkaa () – Tämä funktio palauttaa iteraattorin kartan ensimmäiseen alkioon.
  • koko() – Tämä funktio palauttaa kartalla olevien kohteiden määrän.
  • tyhjä() – Tämä funktio palauttaa totuusarvon, joka ilmaisee, onko kartta tyhjä.
  • insert(pair(avain, arvo)) – Tämä funktio lisää uuden avain-arvo-parin karttaan.
  • etsi(arvo) – Tämä funktio antaa iteraattorin val-elementille, jos sellainen löytyy. Muussa tapauksessa se palauttaa m.end().
  • pyyhi (iteraattorin sijainti) – Tämä funktio poistaa alkion iteraattorin osoittamasta kohdasta.
  • pyyhkiä (jatkuu g) – Tämä funktio poistaa avain-arvon g kartalta.
  • asia selvä() – Tämä funktio poistaa kaikki kohteet kartalta.

Kun funktiot on määritelty, seuraavat esimerkit ottavat ne käyttöön iteroinnilla aloittaen.

Iterointi karttaelementtien kautta

Voit iteroida karttaelementtien läpi. Meidän tarvitsee vain luoda iteraattori ja käyttää sitä tähän tarkoitukseen. Esimerkiksi:

Esimerkki 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;
	}
}

lähtö:

C++ karttaiteraatio Esimerkin 1 tuloste

Tässä on kuvakaappaus koodista:

C++ karttaiteraation esimerkki 1 koodi

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  2. Sisällytä merkkijonootsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  3. Sisällytä karttaotsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  4. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  5. Kutsu main()-funktiota. { merkitsee funktion rungon alkua.
  6. Luo kartta nimeltä Opiskelijat, jossa avaimet ovat kokonaislukuja ja arvot merkkijonoja.
  7. Lisää arvot karttaan Opiskelijat. Avain 200 ja Alice-arvo lisätään karttaan.
  8. Lisää arvot karttaan Opiskelijat. Avain 201 ja Johnin arvo lisätään karttaan.
  9. Käytä size()-funktiota saadaksesi Opiskelijat-nimisen kartan koon. Tämän pitäisi palauttaa arvo 2.
  10. Tulosta tekstiä konsoliin.
  11. Käytä for-silmukkaa luodaksesi iteraattorin nimeltä se iteroimaan kartan elementtejä nimeltä Opiskelijat.
  12. Tulosta kartan Opiskelijat-arvot konsoliin.
  13. For-silmukan rungon loppu.
  14. Main()-funktion rungon loppu.

Lisätään tietoja std::karttaan

Voit syöttää kohteita std::map-funktioon insert()-funktiolla. Muista, että std::map-avainten on oltava yksilöllisiä.

Joten se tarkistaa ensin, onko kutakin avainta kartalla. Jos avain on, merkintää ei lisätä, mutta se palauttaa olemassa olevan merkinnän iteraattorin. Jos sitä ei ole, merkintä lisätään.

Funktiolla on seuraavat muunnelmat:

  • lisää(pari) – tässä muunnelmassa avain-arvo-pari lisätään karttaan.
  • lisää(aloitus_arvo, loppu_arvo) – tässä muunnelmassa merkinnät lisätään start_itr- ja end_itr-muuttujien määrittämälle alueelle toisesta kartasta.

insert_or_assign()-funktio toimii samalla tavalla kuin insert()-funktio, mutta jos annettu avain on jo olemassa kartassa, sen arvoa muutetaan.

Esimerkki 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;
}

lähtö:

C++ kartan lisäys Esimerkki 2 tuloste

Tässä on kuvakaappaus koodista:

C++ kartan lisäys Esimerkki 2 koodi

Code Selitys:

  1. Sisällytä karttaotsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  2. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  3. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  4. Kutsu main()-funktiota. { merkitsee funktion rungon alkua.
  5. Luo kartta nimeltä m, jossa avaimet ovat kokonaislukuja ja arvot ovat kokonaislukuja. Karttaan on tehty kolme merkintää.
  6. Lisää karttaan uusi merkintä m. Avain 5 ja arvo 6 lisätään karttaan.
  7. Yritetään tehdä syöttöä jo olemassa olevaan avaimeen. Koska avain 1 on jo olemassa kartassa, syöttöä ei tehdä.
  8. Käytetään insert_or_assign()-funktiota olemassa olevan merkinnän lisäämiseen tai muokkaamiseen. Koska avain 1 on jo olemassa, sen arvoksi muutetaan 6.
  9. Tulosta tekstiä konsoliin. "\t"-merkki luo vaakatilan, kun taas "\n"-merkki siirtää hiiren osoittimen seuraavalle riville.
  10. Käyttää silmukalle luoda iteraattori nimeltä itr iteroimaan kartan elementtejä nimeltä m.
  11. Tulosta kartan m arvot konsoliin. "\t"-merkki luo vaakatilan kunkin näppäimen ja sitä vastaavan arvon väliin. Sitä vastoin "\n"-merkki siirtää hiiren kohdistimen seuraavalle riville jokaisen iteroinnin jälkeen.
  12. For-silmukan rungon loppu.
  13. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  14. Main()-funktion rungon loppu.

Haku kartalta

Voimme käyttää find()-funktiota etsiäksemme kartan elementtejä niiden avainten perusteella. Jos avainta ei löydy, funktio palauttaa std::map::end-arvon. Muussa tapauksessa palautetaan haetun elementin iteraattori.

Esimerkki 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';
	}
}

lähtö:

C++ karttahaku esimerkki 3 tuloste

Tässä on kuvakaappaus koodista:

C++ kartta etsintä haku esimerkki 3 koodi

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja ilman virheitä.
  2. Sisällytä merkkijonootsikkotiedosto koodiimme käyttääksesi sen toimintoja ilman virheitä.
  3. Sisällytä karttaotsikkotiedosto koodiimme käyttääksesi sen toimintoja ilman virheitä.
  4. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  5. Kutsu main()-funktiota. Merkki { merkitsee main()-funktion rungon alkua.
  6. Luo kartta nimeltä Opiskelijat, joiden avaimet ovat kokonaislukuja ja arvomerkkijonoja.
  7. Lisää arvot karttaan Opiskelijat. Avain 200 ja Alice-arvo lisätään karttaan.
  8. Lisää arvot karttaan Opiskelijat. Avain 201 ja Johnin arvo lisätään karttaan.
  9. Etsi avaimeen 201 liittyvä arvo.
  10. Käytä if-lausetta tarkistaaksesi, löytyykö avaimen arvo.
  11. Tulosta avaimen arvo tekstin rinnalle konsoliin.
  12. if-lauseen rungon loppu.
  13. Main()-funktion rungon loppu.

Tietojen poistaminen kartalta

Voimme käyttää erase()-funktiota arvon poistamiseen kartalta. Luomme yksinkertaisesti iteraattorin, joka osoittaa poistettavaan elementtiin. Iteraattori annetaan sitten erase()-funktiolle.

Esimerkki 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;
}

lähtö:

C++ kartta pyyhi poisto esimerkki 4 tuloste

Tässä on kuvakaappaus koodista:

C++ kartta pyyhi poisto esimerkki 4 koodi

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  2. Sisällytä merkkijonootsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  3. Sisällytä karttaotsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  4. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  5. Kutsu main()-funktiota. Merkki { merkitsee main()-funktion rungon alkua.
  6. Luo kartta nimeltä my_map, jonka avaimet ovat merkkijonoja ja arvot kokonaislukuja.
  7. Lisää arvot karttaan my_map. Lehmän avain ja arvo 1 lisätään karttaan.
  8. Lisää arvot karttaan my_map. Cat-avain ja arvo 2 lisätään karttaan.
  9. Lisää karttaan my_map arvo 3 leijonan avaimella.
  10. Luo iteraattori iteroidaksesi kartalla my_map etsimässä avainkissaa.
  11. Poista iteraattorin osoittama elementti.
  12. Käytä iteraattoria iteroidaksesi kartan my_map elementtien läpi alusta loppuun.
  13. Tulosta kartan my_map sisältö konsolissa.
  14. Ohjelman on palautettava tulos, kun se on suoritettu onnistuneesti.
  15. Main()-funktion rungon loppu.

UKK

std::map pitää avaimet lajiteltuina itseään tasapainottavan binäärisen hakupuun avulla, joka tarjoaa O(log n) operaatiota. std::unordered_map käyttää hajautustaulukkoa keskimääräisille O(1) hauille, mutta ei tallenna avaimia missään tietyssä järjestyksessä. Valitse järjestystarpeidesi mukaan.

std::map toteutetaan tyypillisesti itseään tasapainottavana binäärisenä hakupuuna, useimmiten puna-mustana puuna. Tämä pitää avaimet lajitellussa järjestyksessä ja takaa logaritmisen ajan lisäys-, poisto- ja hakutoiminnoille.

Ei. std::map sisältää vain yksilöllisiä avaimia, joten olemassa olevan avaimen lisääminen ei korvaa sitä. Kun tarvitaan kaksoisavaimia, käytä std::multimap-muuttujaa, jonka avulla useat elementit voivat jakaa saman avainarvon.

Käytä map_name[key]-funktiota arvon lukemiseen tai määrittämiseen; alaindeksioperaattori lisää oletusarvon, jos avain puuttuu. at()-jäsen heittää poikkeuksen puuttuvista avaimista, mikä tekee siitä turvallisemman vaihtoehdon.

Välitä mukautettu vertailija kolmantena malliargumenttina, kuten std::map >. Suurempi komparaattori järjestää avaimet suurimmasta pienimpään oletusarvoisen nousevan järjestyksen sijaan.

std::map tallentaa avain-arvo-parit ja etsii arvoja avaimen mukaan, kun taas std::set tallentaa vain yksilölliset avaimet, joihin ei liity arvoa. Molemmat pitävät elementit lajiteltuina, mutta map liittää tiedot kuhunkin avaimeen.

Kyllä. Tekoälykoodausavustajat muuttavat lyhyen kehotteen tai kommentin toimivaksi std::map-koodiksi, mukaan lukien määrittelyt, lisäyskutsut ja iteraattorisilmukat. Tarkista aina luodut avaintyypit, järjestys ja reunatapaukset ennen kääntämistä.

Kyllä. GitHub Copilot ehdottaa map-määrittelyjä, insert- ja find-kutsuja sekä iteraatiosilmukoita kirjoittaessasi. Se käsittelee toistuvat mallikoodit hyvin, vaikka avainten ainutlaatuisuus ja logiikka tulisi silti varmistaa ennen rakentamista.

Tiivistä tämä viesti seuraavasti: