Ještě jednou a lépe: odstranění prvku z kontejneru po ověření jeho existence v C++

Od Petr Zemek, 2014-05-17

Dneska se podíváme na to, jak zjednodušit odstraňování prvků z kontejneru v C++.

Původní kód

Mějme následující kód:

std::map<int, int> m;
// ...
if (m.find(key) != m.end()) {
    m.erase(key);
}

Nejdříve si zjistíme, zda daný prvek v mapě existuje, a pokud ano, tak jej odstraníme.

Proč takto ne?

Kód výše vlastně dělá toto:

if (/* zjisti pozici prvku v mapě a zahoď ji */) {
    /* nalezni ji znovu a zruš prvek, který se na této pozici nachází */
}

Pokud daný klíč v mapě existuje, tak se daná mapa prohledá dvakrát.

Jak to udělat lépe?

m.erase(key);

Je zbytečné zjišťovat, zda se daný prvek v mapě nachází, protože std::map::erase() to musí tak či tak ověřit, aby mohla vrátit buď 1 či 0. Mapa se pak prohledá právě jednou.

Poznámky na závěr

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
13 + 1 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.