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.