C++ Academy · Oppitunti

multimap ja multiset

Salli päällekkäiset avaimet

Oppitunti 3/413 vaihetta

multimap ja multiset on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Duplikaattien salliminen

std::multimap ja std::multiset toimivat kuten map ja set, mutta ne sallivat duplikaattiavaimet. Kaikki pysyy järjestettynä.

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 3, 3, 3};
    for (int x : ms) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

multisetin lisääminen

Jokainen insert()-kutsu multisetissä onnistuu, myös toistuvien arvojen kohdalla, joten säilö kasvaa joka kerta.

#include <iostream>
#include <set>

int main() {
    std::multiset<std::string> ms;
    ms.insert("a");
    ms.insert("a");
    ms.insert("a");
    std::cout << ms.size() << " elements\n";
    return 0;
}

Duplikaattien laskeminen

count() palauttaa nyt, montako kertaa arvo esiintyy, joten tulos voi olla suurempi kuin 1.

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{5, 5, 5, 7, 9, 9};
    std::cout << "5 appears " << ms.count(5) << " times\n";
    std::cout << "9 appears " << ms.count(9) << " times\n";
    return 0;
}

Kaikkien tai yhden poistaminen

erase(key) poistaa kaikki vastaavat alkiot. Jos haluatte poistaa vain yhden, käyttäkää find()-haun palauttamaa yksittäistä iteraattoria.

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 2, 3};
    ms.erase(ms.find(2));
    std::cout << "count of 2: " << ms.count(2) << '\n';
    return 0;
}

multimapin perusteet

std::multimap yhdistää avaimet arvoihin, mutta sallii yhden avaimen yhdistämisen useisiin arvoihin. Huomautus: sillä ei ole lainkaan operator[]-operaattoria.

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm;
    mm.insert({"fruit", 1});
    mm.insert({"fruit", 2});
    mm.insert({"veg", 3});
    std::cout << mm.size() << " pairs\n";
    return 0;
}

multimapin iterointi

Iterointi tuottaa kaikki parit avainten järjestetyssä järjestyksessä, myös toistuvat avaimet.

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm{{"a", 1}, {"a", 2}, {"b", 3}};
    for (const auto& [k, v] : mm) {
        std::cout << k << " => " << v << '\n';
    }
    return 0;
}

equal_range

equal_range(key) palauttaa iteraattoriparin, joka rajaa kaikki kyseisen avaimen sisältävät alkiot. Se on vakiintunut tapa lukea kaikki tietyn avaimen arvot.

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, int> mm{{"x", 10}, {"x", 20}, {"y", 30}};
    auto range = mm.equal_range("x");
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << ' ';
    }
    std::cout << '\n';
    return 0;
}

Tietojen ryhmittely

multimap sopii erinomaisesti ryhmittelyyn: esimerkiksi useat henkilöt voivat asua samassa kaupungissa.

#include <iostream>
#include <map>

int main() {
    std::multimap<std::string, std::string> byCity{
        {"NYC", "Alice"}, {"NYC", "Bob"}, {"LA", "Carol"}
    };
    auto r = byCity.equal_range("NYC");
    for (auto it = r.first; it != r.second; ++it)
        std::cout << it->second << '\n';
    return 0;
}

lower_bound multisetissä

Järjestetyt aluekyselyt toimivat edelleen. lower_bound löytää ensimmäisen alkion, joka ei ole kohdetta pienempi.

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 2, 2, 3, 4};
    auto it = ms.lower_bound(2);
    std::cout << "first >= 2 is " << *it << '\n';
    return 0;
}

Järjestetty frekvenssilista

Koska alkiot pysyvät järjestyksessä, multiset tuottaa luonnostaan järjestetyn tulosteen, jossa toistot säilyvät.

#include <iostream>
#include <set>

int main() {
    std::multiset<int> scores{90, 75, 90, 60, 75, 90};
    for (int s : scores) std::cout << s << ' ';
    std::cout << '\n';
    return 0;
}

Kokonaismäärä ja yksilölliset arvot

size() laskee jokaisen alkion, myös duplikaatit, kun taas yksilöllisten avainten läpikäynti edellyttää toistojen ohittamista itse.

#include <iostream>
#include <set>

int main() {
    std::multiset<int> ms{1, 1, 2, 3, 3};
    std::cout << "total: " << ms.size() << '\n';
    std::cout << "count of 1: " << ms.count(1) << '\n';
    return 0;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte alkioiden poistamista multisetistä.

Kertaus

Opitte, että multimap ja multiset:

  • sallivat duplikaattiavaimet ja pysyvät silti järjestettyinä
  • käyttävät equal_range-funktiota kaikkien saman avaimen jakavien arvojen lukemiseen
  • poistavat erase(key)-kutsulla kaikki vastaavat alkiot, kun taas iteraattorin poistaminen poistaa yhden alkion

Seuraavaksi opitte hallitsemaan järjestystä mukautettujen vertailijoiden avulla.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”multimap ja multiset” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “multimap ja multiset”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”multimap ja multiset”?

Salli päällekkäiset avaimet Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”multimap ja multiset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. std::map
  2. std::set
  3. multimap ja multiset
  4. Mukautetut vertailijat
← Takaisin: C++ Academy