Error: map/set iterators incompatible



  • Hi,

    ich habe folgendes Problem und habe leider keine Ahnung wie ich den Fehler beheben soll:

    ich lege eine liste von sets der größe numCellsPerVL an:

    this->DD = new DisjoinedData(ltm->getSize());
    
    DisjoinedData(uint numCellsPerVL):numCellsPerVL(numCellsPerVL), maxSize(numCellsPerVL/2){
    		this->candidates = new set<uint>[numCellsPerVL]; 				 
    }
    

    deklaration ist die folgt:

    private:	
    set<uint>* candidates;
    

    bis hierhin wird auch noch nicht gemeckert,
    aber wenn ich versuche auf die sets wie folgt zuzugreifen, bekomme ich den Fehler:

    Expression: map/set iterators incompatible

    set_union(setUnion.begin(), setUnion.end(), (this->DD->getCandidates(start)).begin(), (this->DD->getCandidates(start)).end(), unionSet.begin());
    

    hat irgendjemand eine Idee wie ich das problem beheben kann?

    edit:

    set<uint> getCandidates(uint cell){
       return this->candidates[cell];
    }
    


  • set<> und map<> speichern ihre Schlüssel schreibgeschützt, damit niemand (versehentlich) die Sortierung durcheinanderbringen kann, deshalb kannst du ihre Iteratoren auch nicht als Ziel für einen Algorithmus angeben.

    Lösung: verwende einen Insert-Iterator als Ziel.



  • danke erstmal für die schnelle antwort.
    hmm, das problem liegt aber nicht im zieliterator (damit meinst du doch "unionSet.begin()", oder?), sondern in diesen beiden zugriffen:

    (this->DD->getCandidates(start)).begin(), (this->DD->getCandidates(start)).end()

    wenn ich stattdessen ein set

    set<uint> pipapo;
    

    deklariere und den aufruf wie folgt ausführe kommt keine fehlermeldung:

    set_union(setUnion.begin(), setUnion.end(), pipapo.begin(), pipapo.end(), unionSet.begin());
    

    edit:

    habe trotzdem mal folgendes getestet (ich hoffe das ist was du meintest ):

    set_union(setUnion.begin(), setUnion.end(), (this->DD->getCandidates(start)).begin(), (this->DD->getCandidates(start)).end(), inserter(unionSet,unionSet.begin()));
    

    bekomme aber nach wie vor denselben error...



  • Hmm, da könnte es auch Probleme damit geben, daß getCandidates() eine temporäre Kopie deiner set zurückgibt. Dadurch erhältst du bei den beiden Aufrufen zwei unabhängige set<>s - und das dürfte spätestens zur Laufzeit krachen.

    (ändert sich denn etwas am Problem, wenn du den Rückgabetyp der getCandidates() in const set<uint>& änderst=)



  • super, danke!

    habe zwar bestimmt noch 10.000 weitere bugs im program, aber zumindest den wär ich schon mal los 🙂


Anmelden zum Antworten