2017-02-14 2 views
1

Note: J'ai passé beaucoup de temps à essayer de comprendre d'où venait mon problème. Cependant, comme j'écrivais ce post, j'ai trouvé la solution à mon problème. Pourtant, je pense que cela vaut la peine de le poster. D'ailleurs, je ne suis pas sûr à 100% de mon interprétation.l'insertion d'unordered_map échoue


Voici mon problème simplifié avec un exemple simple.

matrix est une représentation clairsemée d'une matrice binaire . Dans cet exemple I choisi:

Chaque colonne est représentée par un set<int>, ce qui donne les indices des éléments non nuls. Par exemple, pour la première colonne de la matrice, les lignes d'indices {0,1,3} sont non nulles.

Objectif de l'algorithme:

  • Pour chaque colonne, trouver le plus haut index sur cette colonne (par exemple, 3 pour la première colonne), voir si une colonne a déjà été insérée dans le highestMapToColumns unordered_map.
  • Ensuite, si une colonne est trouvée, effectuez certaines opérations sur la colonne. Cependant, aucune opération n'est effectuée ici, par souci de clarté.
  • Enfin, ajoutez la paire (highestIndex,column) à la carte non ordonnée highestMapToColumns.

`

// 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; 
} 

sortie de ce programme:

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 

La première "colonne not found" sortie est normal puisque rien n'a été inséré dans la carte non ordonnée, mais , la seconde ne l'est pas. J'ai inséré un point d'arrêt et débogué au moment de l'insertion. J'ai observé que *iteratorOnColumns n'était pas un nullptr, et qu'il pointait sur le set<int> attendu représentant column1.

Il doit y avoir un problème d'insertion ...

+0

Aussi, pourquoi tant de pointeurs?N'aurait pas 'vecteur > matrice;' ne fait que très bien, et simplifier le code beaucoup? –

+0

Totalement! J'ai choisi cela à l'origine mais je l'ai changé en pensant que cela pourrait être à l'origine du problème ... – Prime360

Répondre

0

Si je comprends bien:

Le problème vient du fait que lorsque je tente de trouver une colonne dans le highestMapToColumns unordered_map, la étant donné la clé highestIndex, il insère la paire (highestIndex,nullptr), ce qui empêche toute insertion supplémentaire de la même clé sur la carte ...

Par conséquent highestMapToColumns, ne retournera le nullptr qui est la première valeur insérée avec la clé highestIndex.

+1

Utilisez plutôt la méthode membre 'find' pour vérifier si un conteneur associatif contient un élément, sans l'insérer automatiquement. 'if (set.find (elem)! = set.end()) ...' –