Access map-Wert über index?
Ich habe diese Karte:
m.insert(pair<int, string>(10, "map1"));
m.insert(pair<int, string>(11, "map2"));
m.insert(pair<int, string>(12, "map3"));
m.insert(pair<int, string>(13, "map4"));
m.insert(pair<int, string>(14, "map5"));
Dann lasse ich Benutzer geben Sie eine Zahl ein:
Please select:
1. Map1
2. Map2
3. Map3
4. Map4
5. Map5
Lassen Sie sagen, wenn Benutzer geben Sie 3 ein, wie bekomme ich den Wert: 12??
- Hast du die Voraussetzung, richtig ? Ich denke, Sie wollte den Schlüssel durch das wissen, den Wert.
- Wenn die ganze Zahl des Paares ist Ihr Wert, dann haben Sie Ihren Schlüssel-Wert-paar in umgekehrter Reihenfolge. Es sollte
pair<string, int>
. Dann wählt der Benutzer3
, dann Holen Sie es mögen:m[string("map") + string(itoa(selection))]
. - Ich dachte die routine, um das Menü anzuzeigen würde Durchlaufen die container, so dass der Menüpunkt wirklich so wäre (eine mehr als) den index. Die Antwort dann ist die Iteration der container zu identifizieren, was die option ist, genau wie getan wurde, um es anzuzeigen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit dem aktuellen setup Sie haben, es gibt keinen einfachen Weg, dies zu tun; Sie müssten für die Iteration über alle Elemente der Karte, Suche nach der einen, hatte
Map3
als Wert.Den
map
ist optimiert, um die Beziehungen in eine Richtung. Gegeben einemap<K, V>
können Sie einfach eine Karte ausK
s zuV
s, aber nicht die andere Weise herum. Der Grund dafür ist, dass, da Sie speichern könnenV
als ein Wert, es gibt keine Garantie, dass Sie eine eindeutige inverse. Das ist, da diese Karte:Gibt es keine sinnvolle Art und Weise zu sagen, welcher Schlüssel den Wert 0; es gibt zwei solche keys, 0 und 1.
Haben Sie viele Möglichkeiten hier. Erste, Sie könnten sich die
map
rund und stattdessen verknüpfen von strings mit ganzen zahlen, sondern als zahlen mit strings. Basierend auf Ihren Fall, wie es scheint, was Sie wollten zu tun in den ersten Platz. Wenn du das gemacht hast, dann könnte man verwenden Sie einfach die eckigen Klammern Betreiber zu suchen, der entsprechende Wert:Oder, wenn Sie waren besorgt darüber, was passieren würde, mit fehlenden Werten, dann könnte man schreiben
Alternativ, wenn Sie wirklich tun haben, um das anzeigen von Ganzzahlen in strings, und Sie wissen, dass jede ganze Zahl ist verbunden mit einer eindeutigen Zeichenkette und Umgekehrt (das heißt, die Karte ist eine bijection), dann könnte man eine Boost.Bimap zu codieren diese bidirektionale Beziehung. Dies würde es sehr leicht hin und her zu gehen zwischen Schlüsseln und Werten.
Hoffe, das hilft!
std::map
nicht verfolgen Sie die Reihenfolge, in der die Elemente eingefügt werden; die Elemente werden gespeichert in sortierter Reihenfolge statt insertion um. Wenn Sie brauchen, um zu verfolgen Sie die Reihenfolge, in der die Elemente eingefügt wurden, die Sie brauchen, um so selbst zu tun. Ein Weg dies zu tun wäre, zu halten, einen zweiten container, der speichert die Schlüssel, um mit einerstd::vector
zum Beispiel:Dann, den Schlüssel der
N
th eingefügte element ist bei indexN - 1
iminsertion_order
Sequenz.Map die ganzen zahlen in dem Menü, um die Daten, die Sie speichern möchten. Bedenken Sie:
Aus der docs:
Also die map-Klasse nicht beibehalten die Reihenfolge Ihrer Elemente als array würde. Gäbe es eine Indizierung Betreiber, es würde mich nicht Rückkehr der i ' te element Hinzugefügt, um die Karte. Es ist ein assocoiative Sammlung, und Sie normalerweise nicht verwenden, die Art der Daten-Struktur, wenn Sie pflegen müssen, um mit der Tugend der Zeitpunkt der insertion.