2017-02-14 5 views
1

Hinweis: Ich verbrachte viel Zeit zu versuchen zu verstehen, wo mein Problem herkam. Als ich diesen Beitrag schrieb, fand ich jedoch die Lösung für mein Problem. Aber ich denke, es lohnt sich immer noch, es zu veröffentlichen. Außerdem bin ich mir bei meiner Interpretation nicht 100% ig sicher.unordered_map Einfügung fehlgeschlagen


Hier ist mein vereinfachtes Problem mit einem einfachen Beispiel.

matrix ist eine spärliche Darstellung einer binären Matrix. In diesem Beispiel wählte I:

Jede Spalte von einem set<int> dargestellt ist, die Indizes der Nicht-Null-Elemente gibt. Zum Beispiel sind Zeilen der Indizes {0,1,3} für die erste Spalte der Matrix nicht Null.

Ziel des Algorithmus:

  • Für jede Spalte finden Sie den höchsten Index auf dieser Spalte (zum Beispiel 3 für die erste Spalte), ob einige Spalte bereits eingeführt worden ist in die highestMapToColumns unordered_map.
  • Wenn eine Spalte gefunden wird, führen Sie einige Operationen für die Spalte aus. Aus Gründen der Klarheit werden hier jedoch keine Operationen durchgeführt.
  • Schließlich fügen Sie das Paar (highestIndex,column) der ungeordneten Karte highestMapToColumns hinzu.

`

// main.cpp 
#include <iostream> 
#include <string> 
#include <vector> 
#include <set> 
#include <unordered_map> 

using namespace std; 

int main(int argc, char** argv) { 

    vector<set<int>* >* matrix = new vector<set<int>* >(); 
    int column1[]= {0,1,3}; 
    int column2[]= {1,3}; 
    matrix->push_back(new set<int>(column1,column1+3)); 
    matrix->push_back(new set<int>(column2,column2+2)); 

    unordered_map<int, set<int>* > highestMapToColumns; 
    int highestIndex = -1; 
    for(vector<set<int>* >::iterator iteratorOnColumns = matrix->begin();iteratorOnColumns!=matrix->end();iteratorOnColumns++){ 
     while(true){ 
      if((*iteratorOnColumns)->size() == 0){ 
       highestIndex = -1; 
       break; 
      } 
      highestIndex = *((*iteratorOnColumns)->rbegin()); 
      cout<<"Attempting to get index : "<<highestIndex<<endl; 
      set<int>* toSubstract = highestMapToColumns[highestIndex]; 
      if (toSubstract != nullptr) { 
       cout<<"Column found !!"<<endl; 
       break; 
      }else{ 
       cout<<"Column not found"<<endl; 
       break; 
      } 
     } 
     if(highestIndex != -1){ 
      cout<<"Attempting to insert index : "<<highestIndex<<endl; 
      highestMapToColumns.insert(make_pair(highestIndex, (*iteratorOnColumns))); 
     } 
    } 
    return 0; 
} 

Output dieses Programms:

Attempting to get index : 3 
Column not found 
Attempting to insert index : 3 
Attempting to get index : 3 
Column not found 
Attempting to insert index : 3 

Die erste "Spalte nicht gefunden" Ausgang ist normal, da nichts in der ungeordneten Karte eingeführt wurde, aber Das zweite ist nicht.

Ich habe einen Haltepunkt eingefügt und debuggte im Moment der Insertion. Ich habe beobachtet, dass *iteratorOnColumns kein nullptr war und dass es auf die erwartete set<int>, die column1 repräsentierte, zeigte.

Es muss ein Problem der Einfügung sein ...

+0

Warum auch so viele Zeiger?Wäre nicht 'Vektor > Matrix;' nur gut, und den Code viel vereinfachen? –

+0

Totally! Ich wählte das ursprünglich, änderte es aber, indem ich dachte, dass es der Ursprung des Problems sein könnte ... – Prime360

Antwort

0

Wenn ich das richtig verstanden:

Das Problem kommt von der Tatsache, dass, wenn ich versuche, mit dem eine Spalte in den unordered_map highestMapToColumns, zu finden gegebenen Schlüssel highestIndex, fügt es das Paar (highestIndex,nullptr), und dies verhindert jede weitere Einsetzen des gleichen Schlüssel in der Karte ...

Deshalb highestMapToColumns wird nur die nullptr zurück, die ist der erste eingegebene Wert mit dem Schlüssel highestIndex.

+1

Verwenden Sie stattdessen die find-Methode, um zu prüfen, ob ein assoziativer Container ein Element enthält, ohne es automatisch einzufügen. 'if (set.find (elem)! = set.end()) ...' –