Použitie std :: map múdro s moderným C ++

Vyskúšajte Náš Nástroj Na Odstránenie Problémov

Obrázok k príspevku

std :: mapa a jeho súrodenci ( std :: multimap , std :: unordered_map / multimapa ) boli moje obľúbené kontajnery, keď som robil súťažné programovanie. V skutočnosti ich mám stále rád (aj keď v dnešnej dobe ich používam menej často). A s Moderné C ++ , teraz máme viac dôvodov na použitie std :: map. Preto som sa rozhodol venovať tejto téme napísaním článku, ktorý sumarizuje tieto nové funkcie. Takže bez väčších nezmyslov sa ponoríme priamo.

/!: Tento článok bol pôvodne uverejnený na mojom Blog . Ak máte záujem dostávať moje najnovšie články, prosím prihláste sa na môj newsletter .



std :: mapa :: obsahuje (C ++ 20)

  • | _+_ | členská funkcia je dobrým krokom k expresivite kódu. A tiež ma unavuje písať:
std::map::contains
  • Z jazyka C ++ 20 môžete písať:
if (auto search = freq_of.find(2); search != freq_of.end()) { cout << 'Found' << endl; } // Where assume, freq_of = map{{3, 1}, {1, 1}, {2, 1}};

Kód, ktorý napíšeme, je napísaný najskôr pre ľudskú spotrebu a až potom pre počítač, aby mu porozumel.

- John Sonmez

std :: mapa :: try_emplace (C ++ 17)

  • Pri vkladaní do mapy máme 2 rôzne možnosti:
  1. Kľúč zatiaľ neexistuje. Vytvorte nový pár kľúč-hodnota.
  2. Kľúč už existuje. Vezmite existujúcu položku a upravte ju.
  • Typický prístup k vloženiu prvku do | _+_ | je pomocou | _+_ |, | _+_ | alebo | _+_ | . Ale vo všetkých týchto prípadoch musíme znášať náklady na predvolený/špecializovaný konštruktér alebo výzvu na priradenie. A najhoršie na tom je, že ak položka už existuje, musíme čerstvo vytvorenú položku zahodiť.
if (freq_of.contains(2)) { cout << 'Found' << endl; }
  • Namiesto toho:
std::map
  • Ale od C ++ 17 existuje toto metóda std :: map :: try_emplace, ktorá vytvára položky iba vtedy, ak kľúč ešte neexistuje . To zvyšuje výkon v prípade, že je vytvorenie objektov tohto typu nákladné.
  • Aj keď vyššie uvedený príklad neukázal nákladné vytváranie položiek. Ale áno! kedykoľvek sa s takouto situáciou stretnete, musíte vedieť, ako ju zvládnuť pomocou | _+_ |.

std :: mapa :: vložiť_alebo_priradiť (C ++ 17)

  • Kedykoľvek musíte vložiť prvok. Kvôli pohodliu používate std :: map :: operator [] . Čo je v poriadku (a nebezpečné )! Pokiaľ nemáte žiadne obmedzenia pri vkladaní alebo priraďovaní.
  • Napríklad pri počítaní frekvencie prvkov s pridaným obmedzením, že keď sa prvok opakuje (tj. Je priradený), musíte odstrániť všetok prvok menší ako aktuálny.
  • V takejto situácii | _+_ | nie je uskutočniteľné. Skôr | _+_ | _ je vhodnejšie a vracia viac informácií ako _ | _+_ |. Tiež nevyžaduje predvolenú konštruovateľnosť mapovaného typu. To isté zvážte aj nasledujúci príklad.
operator[ ]

#programming #coding #cpp11 #cpp #computer-science

medium.com

Použitie std :: map múdro s moderným C ++

std :: map a jej súrodenci (std :: multimap, std :: unordered_map/multimap) bývali moje obľúbené kontajnery, keď som robil konkurenčné…

Pozri Tiež: