Eine andere Möglichkeit, dies zu implementieren, ist mit a map
anstelle von a vector
. Ich werde Ihnen diesen Ansatz zeigen und die Unterschiede diskutieren:
Erstellen Sie einfach eine Klasse mit zwei Karten hinter den Kulissen.
#include <map>
#include <string>
using namespace std;
class SpecialMap {
// usual stuff...
private:
int counter_;
map<int, string> insertion_order_;
map<string, int> data_;
};
Sie können dann einen Iterator data_
in der richtigen Reihenfolge dem Iterator aussetzen . Die Art insertion_order_
und Weise, wie Sie dies tun, wird durchlaufen , und für jedes Element, das Sie aus dieser Iteration erhalten, führen Sie eine Suche in der data_
mit dem Wert von durchinsertion_order_
Sie können das effizientere hash_map
für insertion_order verwenden, da es Ihnen nicht wichtig ist, direkt durchzugehen insertion_order_
.
Zum Einfügen können Sie eine Methode wie die folgende verwenden:
void SpecialMap::Insert(const string& key, int value) {
// This may be an over simplification... You ought to check
// if you are overwriting a value in data_ so that you can update
// insertion_order_ accordingly
insertion_order_[counter_++] = key;
data_[key] = value;
}
Es gibt viele Möglichkeiten, wie Sie das Design verbessern und sich um die Leistung sorgen können. Dies ist jedoch ein gutes Grundgerüst, um diese Funktionalität selbst zu implementieren. Sie können es als Vorlage erstellen und Paare tatsächlich als Werte in data_ speichern, damit Sie leicht auf den Eintrag in insertion_order_ verweisen können. Aber ich lasse diese Designprobleme als Übung :-).
Update : Ich denke, ich sollte etwas über die Effizienz der Verwendung von map vs. vector für insertion_order_ sagen
- sucht direkt in Daten, in beiden Fällen sind O (1)
- Einfügungen im Vektoransatz sind O (1), Einfügungen im Kartenansatz sind O (logn)
- Löschungen im Vektoransatz sind O (n), da Sie nach dem zu entfernenden Element suchen müssen. Beim Kartenansatz sind sie O (logn).
Wenn Sie weniger Löschvorgänge verwenden möchten, sollten Sie möglicherweise den Vektoransatz verwenden. Der Kartenansatz wäre besser, wenn Sie eine andere Reihenfolge (wie Priorität) anstelle der Einfügereihenfolge unterstützen würden.