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éehighestMapToColumns
.
`
// 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 ...
Aussi, pourquoi tant de pointeurs?N'aurait pas 'vecteur> matrice;' ne fait que très bien, et simplifier le code beaucoup? –
Totalement! J'ai choisi cela à l'origine mais je l'ai changé en pensant que cela pourrait être à l'origine du problème ... – Prime360