Jste zde

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

V tomto novém seriálu vždy ukáži kód, který je v určitém ohledu nevhodný, a ukážeme si, jak jej vylepšit. Začneme se získáním prvku ze standardních kontejnerů v C++ po ověření jeho existence.

Původní kód

S následujícím kódem jsem se v různých obměnách setkal již několikrát:

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

Nejdříve si zjistíme, zda prvek v dané mapě existuje, a pokud ano, tak vrátíme hodnotu, která je k němu asociovaná.

Proč takto ne?

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

if (/* získej hodnotu pro daný klíč, ověř, zda byla nalezena, a zahoď ji */) {
    /* nalezni ji znovu a vrať ji */
}

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

Jak to udělat lépe?

Když už jsme prvek nalezli, tak jej můžeme hned vrátit, aniž bychom jej hledali znovu:

std::map<int, int>::iterator it(m.find(key));
if (it != m.end()) {
    return it->second;
}

Mapa se pak prohledá právě jednou.

Přidat komentář