Portál AbcLinuxu, 10. května 2025 05:31
Řešení dotazu:
#include <iostream> #include <string> #include <map> typedef std::map<std::string, std::string> osoba_t; int main() { osoba_t osoba; osoba["adresa"] = "mars colony"; osoba["jmeno"] = "Douglas Quaid"; std::cout << "jmeno = " << osoba["jmeno"] << ", adresa = " << osoba["adresa"] << "\n"; }
Pokud bys těch osob měl pár tisíc a chtěl to mít opravdu hezky, asi by stálo za to si udělat index, kde by byla hodnota, v jaké položce je a pointer na osobu do toho pole. Tan index by byl seřazen podle hodnoty a pomocí bsearch bys po tom pobíhal.s binarnim vyhledavanim bych byl opatrnej. Ono ma sice lepsi asymptotickou slozitost, ale pro maly n je pomalejsi. Hlavni duvod je pravdepodobne obtizna predikce skoku. Kdysi jsem s tim delal nejaky pokusy a binarni vyhledavani bylo rychlejsi nez sequencni hledani az pri asi n > 30 Pokud bych chtel max rychlost tak bych to udelal nejak takhle:
struct osoba_t { char *jmeno; char *adresa; ... } char *najdi_pole(osoba_t *o, char *pole) { if (!strcmp(pole, "jmeno")) { return o->jmeno; } else if (!strcmp(pole, "adresa")) { return o->adresa; } else { ... } }takhle bude mit vyhledavani v jedny funkci takze tam nebude zadna redundance a pokud v ty strukture nema moc polozek tak to bude i rychly. Ty if-y navic muze seradit tak aby ty nejcastejsi byly na zacatku.
Pokud bys těch osob měl pár tisíc a chtěl to mít opravdu hezky...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.