2017-08-09 1 views
1

Ich suche nach allen Teilmengen eines Satzes der Größe n, z. {{}, {1}, {1, 2} etc. } unter Verwendung der beschriebenen Methode here.Einfügen primitiven Typs in Mengen von Sets

Mein Problem entsteht mit dem Versuch, eine Reihe von Sätzen mit C++ 11 zu erstellen. Ich habe nämlich eine set<set<int> > permutations, die alle meine Untermengen enthält. Wenn ich einige ganzzahlige Element i in jede der Teilmengen in permutations enthaltenen einzufügen versuchen, wie folgt:

for (set<set<int> >::iterator it = permutations.begin(); it != permutations.end(); ++it) 
{ 
    it->insert(i); //error here 
} 

I führen zu einem „keine Instanz von überladenen Funktion entspricht der Argumentliste (das Objekt Qualifier eingeben, die verhindern, dass eine Übereinstimmung“Fehler. Mein Verständnis ist, dass Iterator it zu einem set<int> Objekt bezieht, und so hat *it Memberfunktion insert(). Was dieser spezielle Fehler, entstehen?

+0

Was ist der Typ von "i"? Bitte stellen Sie [MCVE] zur Verfügung. –

+0

@Carcigenicate Der Iterator eines Satzes > sollte auf 1 gesetzt werden, obwohl ... nein? – Borgleader

+0

@Borgleader Whoops, du hast Recht, mein Schlechter. – Carcigenicate

Antwort

3

Sie sind nicht erlaubt ist, bewirkt, dass die Elemente eines Satzes zu ändern weil dies den internen Ordnungsmechanismus, den der Satz verwendet, durchbrechen würde *it in Ihrer Schleife ist const set<int>&. Folglich können Sie den Einsatz nicht aufrufen.

Sie können eine Kopie des Elements erstellen, ein Element in die Kopie einfügen, das Original entfernen und durch die Kopie ersetzen.

for (set<set<int> >::iterator it = permutations.begin(); it != permutations.end();) 
{ 
    auto copy = *it; 
    copy.insert(i); 
    it = permutations.erase(it); 
    permutations.insert(copy); 
} 

Beachten Sie, dass, wenn in einem Satz ein Element eingefügt macht es zu einem anderen identisch, es wird nicht eingefügt werden, und Sie werden mit einem weniger Elemente festgelegt in Ihrem Set enden. Wenn Ihre Menge beispielsweise {{}, {1}, {1,2}} ist und i 1 ist, dann wird die obige Schleife die leere Menge betrachten, eine 1 dazu hinzufügen (was zu {1} führt), und dann wird sie fehlschlagen, wenn sie versucht, diese Menge wieder hinzuzufügen , denn es gibt bereits eine Menge mit diesem Wert.

+0

Was das OP will, ist noch wahrscheinlicher (ich rate nur), einen Gesamtinhalt des Satzes vorzubereiten und es dann in einen Meta-Satz von Sätzen einzufügen. Wenn er einen einzelnen Satz für Permutationen verwendet, sollte er in eine geklonte Kopie des Arbeitssatzes von Meta-Sets einfügen, d. H. Die Mutationen müssen auf dem Arbeitssatz auftreten, der nicht in Meta eingefügt wurde. Also ich glaube nicht, dass er remove + change + re-insert pattern braucht, IMO braucht er nur M mal "insert (clone (workingSet))". – Ped7g

+0

Ah danke für die Ausarbeitung und auch eine Lösung. Und @ Ped7g du hast Recht, ich habe eine Kopie des Arbeitssatzes geklont (bei jeder Iteration von 'i' bis n). –

Verwandte Themen