2017-12-17 21 views
0

So weit ich verstehe, die Boost: unordered_map und std :: unordered_map funktionieren die gleichen in Bezug auf "Überlauf" (aka mehrere Dinge, die mit dem gleichen Schlüssel eingefügt werden). Sie speichern es in einem "Eimer", so dass Sie dann über sie iterieren können.Cant interrate durch Überlauf in einer unorderd Karte

Zum Beispiel:

key: data: 
"apple" 2 
"peach" 4 
"apple" 3 
"peach" 8 

dann der Eimer für "apple" enthalten würde 2 & 3, nicht wahr?

Nun, ich habe Probleme mit diesen Dingen.

Hier ist mein Code:

#define ANZ 10 
typedef boost::unordered_map<uint16_t, int> uuidMap_int; 


using namespace std; 

int main() 
{ 
    uuidMap_int uuidMap; 
    boost::uuids::uuid entity1; 
    boost::uuids::uuid entity2; 

    for(unsigned int i = 0;i<ANZ;i++) 
     uuidMap.insert(std::pair<int,int>((i<5?0:1),i)); 

    for(unsigned int i = 0;i < uuidMap.bucket_count();i++){ 
     for(uuidMap_int::local_iterator it = uuidMap.begin(i); it != uuidMap.end(i);++it){ 
      std::cout<<it->first<<"|"<<it->second<<"\n"; 
     } 
    } 
    return 0; 
} 

Alles, was es tut, ist zwei neue Einträge in der Karte zu machen und sie zu füllen. Hier ist, wie die Ausgabe aussehen soll:

0|0 
0|1 
0|2 
. 
. 
. 
1|5 
1|6 
. 
. 
. 
1|10 

Aber es sieht wirklich wie diese

0|0 
1|5 

Nun ich weiß nicht, warum dies geschieht. Es scheint, als ob der "Überlauf" einfach verwüstet wird. Ich versuche jedoch, so etwas wie eine kleine Datenbank zu machen, also brauche ich eine Möglichkeit, eine ID und eine Menge von Daten, die zu dieser ID gehören, in einer Karte wie dieser zu haben.

Was mache ich falsch/welche andere Karte erlaubt mir, so zu arbeiten, wie ich möchte?

+2

Was passiert, ist Ihr Verständnis ist falsch. Ansonsten tust du nichts falsches. – juanchopanza

+0

@juanchopanza, um zu erklären, wo ich falsch liege oder wirst du mich einfach hier hängen lassen? – MoustacheSpy

+1

Vielleicht lesen Sie dies: http://en.cppreference.com/w/cpp/container/unordered_map. 'unordered_map' enthält Schlüssel-Wert-Paare. Was Sie wahrscheinlich brauchen, ist ['std :: unordered_multimap'] (http://en.cppreference.com/w/cpp/container/unordered_multimap). – juanchopanza

Antwort

0

Das Problem (und was @juanchopanza zu zeigen versucht) ist, dass Sie die Dokumentation über eine Klasse lesen müssen, um sie korrekt zu verwenden. Eine Map ist eine Beziehung zwischen einem Schlüssel (dem Indexierungsschlüssel) und einem Wert (den gespeicherten Daten). In diesem Fall verwenden Sie nur zwei Schlüssel (nämlich 0 und 1) und jede insert() Sie tun, um die Karte nur weigert sich, Elemente auf die bereits zwei Schlüsselzellen mit den neuen Daten einfügen. Das erwartete Verhalten ist das, das Sie erhalten (Sie verwenden nur zwei verschiedene Schlüssel, Sie haben nur zwei Zellen mit Daten), die ersten Einträge, die Sie mit den jeweils nur zwei verwendeten Schlüsseln eingefügt haben. Multimap Klassen können Sie haben mehrere Einträge mit dem gleichen Schlüssel, so dass Sie alle Ihre Elemente richtig eingefügt bekommen.

Aber die andere Frage, die bleibt, ist, warum man map verwendet, wenn Sie nicht die Funktionalität verwenden, die es Ihnen anbietet. Die Karte erlaubt Ihnen, die Elemente nach Schlüssel zu unterscheiden, also normalerweise nicht einfügen (vielleicht nur in Multimaps, wo Sie Elemente nicht nach Schlüssel unterscheiden können), sondern put() die Elemente und indizieren sie nach Schlüssel (mit dem Operator [])?

Bitte lesen Sie gründlich die Dokumentation zu jeder Klasse.

Verwandte Themen