map<char,int> Defaultwert ändern?
-
Ich habe eine map
map<char,int> mund möchte den Standartwert, also den Wert, der in
m[key]falls key noch nicht besetzt ist zurückgegeben wird, ändern.
Wenn ich mich recht erinnere ist map so implementiert, dass sie dabei
T()verwendet.
Ist es wirklich der einzige Weg eine Wrapper Klasse für int zu schreiben und dort einen angepassten Defaultkonstruktor anzubieten?
grüße und dank im voraus
~nirsaja
-
Ich weiß leider auch keine super Lösung,
- bevor ich mir einen Int wrapper schreibe würde ich mir lieber eine eigene map ableiten, die dann map<>::key_type im Konstuktor mitbekommt und damit die "leeren" keys initialisiert.
- Wieso kuckt man nicht vorher mit find ob es den key schon gibt?
-
- Wieso kuckt man nicht vorher mit find ob es den key schon gibt?
Macht das die map auch, wenn sie den Wert zurückgibt?
Ansonsten ist das zu langsam.
-
nirsaja schrieb:
- Wieso kuckt man nicht vorher mit find ob es den key schon gibt?
Macht das die map auch, wenn sie den Wert zurückgibt?
Ansonsten ist das zu langsam.Natürlich sucht sie den Wert. Woher soo sie ihn denn haben? Allerdings würde ich nach dem find natürlich direkt den iterator verwenden und nicht nochmal den operator[] aufrufen, da das zu einer weiteren Suche führen würde.
-
find() gibt aber end() zurück falls der Schlüssel nicht existiert - und dann muß insert() die Einfügeposition wieder suchen.
Prinzipiell kann die map-implementaiton das "interne" find-Ergebnis nutzen um sich den zweiten lookup zu sparen. Es gibt aber mindestens eine Implementation, die das nicht tut.
---------Wieviele Elemente soll deine map ca. enthalten? Soll char irgendwann mal durch wide char ersetzt werden?
mit einem int[256] belegst du 1KB (32bit), das ist noh hinreichend cache-effektiv (break even bei ca. 64 Einträgen), hat einen rasanten lookup und kann ganz einfach mit einem Defaultwert vorbelegt werden.
-
der funtion, die zu nutzen ist, ist nat. lower_bound und nicht find. der iterator, der zurückgegeben wird ist dann entweder das gesuchte element oder die stelle, an der es eingefügt werden müsste. im gegensatz zu find wird op< hier nicht zweimal angewendet, es finden folglich keine überflüssigen operationen statt. bei einem derart eingeschränkten schlüsselbereich gibt es allerdings kaum gründe, kein array oder vector zu benutzen.
-
der funtion, die zu nutzen ist, ist nat. lower_bound und nicht find.
Exakt. Und wie das in Code aussieht, zeigt Scott Meyers in "Effective STL - Item 24"
template <class MapType, class KeyArgType, class ValueArgType> typename MapType::iterator efficientAddOrUpdate(MapType& m, const KeyArgType& k, const ValueArgType& v) { typename MapType::iterator lb = m.lower_bound(k); if (lb != m.end() && !(m.key_comp()(k, lb->first)) { // update existing lb->second = v; return lb; } else { // insert new typedef typename MapType::value_type MVT; return m.insert(lb, MVT(k, v)); } }
-
(OT)
gibt es einen Grund, das KeyArgType und ValueArgType template-parameter sind?Folgendes sollte doch auch:
template <class MapType> typename MapType::iterator efficientAddOrUpdate(MapType& m, typename MapType::key_type const & k, typename MapType::arg_type const & v)oder?