unordered_map: was, zurück, wenn der Schlüssel nicht in der map?

Als ein Vorwort zu dieser Frage muss ich sagen, dass ich bin ein Java-Programmierer und daher viel mehr daran gewöhnt, die Semantik von Karten, die in Java als in C++. In Java ist es durchaus üblich und zu erwarten, bekommen null zurückgegeben, wenn auf der Suche nach einem Schlüssel in der Map. Ich bin beim übersetzen einige von unseren code in c++, und versuchen zu finden der c++ - Weg, Dinge zu tun, wenn die Interaktion mit einer unordered_map.

Speziell habe ich eine Klasse, die enthält eine unordered_map. Anstelle der Freilegung der Karte direkt zu dem client-code, ich habe 2 die wrapper-Funktionen, eine put Schlüssel/Wert-paar in die map ein, und eine zum abrufen des Werts für den angegebenen Schlüssel habe ich.e:

void set_tag_value(string tag, string value);

string& get_tag_value(string tag);

Wenn ich unordered_map.at() den Wert abgerufen wird, dann wird eine Ausnahme geworfen, die meinen code brauchen würde, um zu fangen, oder alternativ, lassen Sie es propagieren, um den client-code. (Vermehrung der Ausnahme das scheint unfreundlich zu mir, obwohl).

Vielleicht eine alternative wäre, ändern Sie den Rückgabewert auf eine string* Typ, und NULL wenn nicht gefunden wird (das ist der Java-Weg, es zu tun), aber dann Benutzer benötigt, um auf NULL prüfen (was auch nicht so freundlich).

Also meine Frage hat zwei Teile:

  1. Was ist eine Entwickler-freundliche Weise zu behandeln, die ausgefallene Aussehen, und was Rückgabewert wäre sinnvoll (Ausnahme, NULL, leerer string ist, oder etwas anderes)?
  2. In meinem code, die Karte look-up-Methode ist eher typisch zu verwenden, wenn Sie erwarten, dass es möglicherweise nicht finden, die Taste auf() und catch-Ausnahme oder finden und überprüfen iterator == Karte.Ende()? (Dieser Teil der Frage ist mir gerade versuchen zu lernen, den c++ - Weg, Dinge zu tun).

Vielen Dank für jeden Rat!

boost::optional oder std::optional (C++14). Weitere details in meiner Antwort hier.
Der "C++ way" wäre, geben den Kunden Zugriff auf die gesamte Oberfläche des unordered_map, so können Sie (zum Beispiel) es gelten die standard-algorithmen, um Sie über Ihre Iteratoren.
Ich fühle mich oft unwohl, welcher den direkten Zugang zur Klasse der internen Datenstrukturen, es sei denn, ich fühle, dass es eine funktionale Verwendung für den client-code für den Zugriff auf ein Objekt. Sicherlich in Java, habe ich oft festgestellt, dass, wie code entsteht, ich ändern Sie die zugrunde liegenden Datenstrukturen, und so alles, was mit Ihnen verbunden hat, übersetzt werden, wie gut. In diesem Fall sollten Kunden nicht egal sein, wie die Zuordnungen werden gespeichert, Sie müssen nur in der Lage sein, um Werte abzurufen (und nicht zu einem Fehler, wenn ein Wert nicht gefunden wird).
Der Punkt ist, dass ein unordered_map bietet bereits eine Recht abstrakte Schnittstelle, die die funktionale und gut gestaltet. Noch wichtiger ist, jeder weiß wer C++ schon weiß, wie die user es. Über alle du bist die Erfüllung von verstecken es ist die Schaffung einer anderen (weniger fähigen) Schnittstelle für Ihre Benutzer zu erfahren.

InformationsquelleAutor Sam Goldberg | 2013-10-04

Schreibe einen Kommentar