Ja und nein. Nein, es gibt niemanden, der genau die gleiche Funktionalität bieten soll. Aber ja, Sie können das Gleiche auf verschiedene Arten tun. Wenn Sie die Daten in erster Linie in der Reihenfolge eingefügt Zugang erwarten, dann ist der offensichtliche Weg zu gehen, wäre eine einfache Vektor von Paaren sein:
std::vector<std::string, std::string> food_colors;
food_colors.push_back({"banana", "yellow"});
food_colors.push_back({"apple", "green"});
food_colors.push_back({"lemon", "yellow"});
for (auto const &f : food_colors)
std::cout << f.first << ": " << f.second << "\n";
Der Bestellung bewahrt, indem einfach die Elemente, um zu speichern. Wenn Sie mit einem Schlüssel darauf zugreifen möchten, können Sie std::find
verwenden, um eine lineare Suche nach einem bestimmten Objekt durchzuführen. Das minimiert den zusätzlichen Speicherverbrauch auf Kosten des langsamen Zugriffs durch den Schlüssel, wenn Sie viele Elemente erhalten.
Wenn Sie einen schnelleren Zugriff mit einer großen Anzahl von Elementen wünschen, können Sie einen Boost MultiIndex verwenden. Wenn Sie das wirklich vermeiden wollen, können Sie ganz einfach einen eigenen Index erstellen. Um dies zu tun, würden Sie beginnen, indem Sie Ihre Artikel in eine std::unordered_map
(oder vielleicht eine std::map
) einfügen. Dies ermöglicht einen schnellen Zugriff per Schlüssel, aber keinen Zugriff in der Reihenfolge der Anzeigen. Es gibt jedoch einen Iterator für jedes Element zurück, wenn es in die Map eingefügt wird. Sie können diese Iteratoren einfach in einem Vektor speichern, um Zugriff in der Reihenfolge des Einfügens zu erhalten. Obwohl das Prinzip der dies recht einfach ist, zu der Code ist ein bisschen auf der ungeschickte Seite, legte es schön:
std::map<std::string, std::string> fruit;
std::vector<std::map<std::string, std::string>::iterator> in_order;
in_order.push_back(fruit.insert(std::make_pair("banana", "yellow")).first);
in_order.push_back(fruit.insert(std::make_pair("apple", "green")).first);
in_order.push_back(fruit.insert(std::make_pair("lemon", "yellow")).first);
Dieser Zugang ermöglicht entweder durch Schlüssel:
// ripen the apple:
fruit["apple"] = "red";
...oder in Auftrag:
for (auto i : in_order)
std::cout << i->first << ": " << i->second << "\n";
Im Moment habe ich den grundlegenden Mechanismus gezeigt, dies zu tun - wenn Sie es verwenden viel wollte, dann würden Sie wahrscheinlich, dass wickeln wollen in eine schöne Klasse bis zu Verstecken Sie etwas von der Hässlichkeit und die Dinge halten schön und sauber im normalen Gebrauch.
Klingt wie ein Job für Boost.Multiindex. –
Danke. Das ist gut zu wissen. Ich frage mich, ob es in C++ 11 verfügbar ist. – packetie
Was soll das bedeuten? Es ist eine C++ - Bibliothek, so dass Sie es mit C++ verwenden können. –