3 Stimmen

C++-Vektor der Menge ergibt Segmentierungsfehler nach Durchführung von push_back

Ich habe in meinem Programm einen Vektor von Sätzen erstellt, und ich muss jeden dieser Sätze durchgehen. Falls ein bestimmtes Element in der Menge gefunden wird, muss ich eine neue Menge zum Vektor hinzufügen. Dies führt jedoch zu einem Segmentierungsfehler, sobald der Zähler meines Arrays die Elemente erreicht, die ich später (innerhalb der Schleife) eingefügt habe. Im folgenden Code erhalte ich einen Segmentierungsfehler, wenn ich list.push_back(cS) einschalte.

int main(void)  {
set<int> cS;
vector<set<int> > list;

cS.insert(1);
list.push_back(cS);

cS.insert(2);
list.push_back(cS);

for (int ctr = 0; ctr < list.size(); ctr++)
{
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++)
    {
        if (*itr == 1 || *itr == 2)
        {
            cS.clear();
            cS.insert(3);
            //list.push_back(cS);
        }
    }
}

for (int ctr = 0; ctr < list.size(); ctr++)
{
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++)
    {
        cout << *itr << endl;
    }
}

return 0;
}

Ich wäre dankbar, wenn jemand erklären könnte, warum dies einen Fehler (in gcc) gibt.

Danke, dass Sie meinen Beitrag gelesen haben.

6voto

Andreas Brinck Punkte 49116

Wenn Sie push_back in Ihren Vektor einfügen, machen Sie alle Verweise auf Elemente darin ungültig, falls der Vektor mehr Speicher zuweisen muss. In Ihrem Fall ist der Iterator itr wird ungültig, nachdem die push_back . Eine Lösung wäre, die Sätze in eine separate Liste (Vektor) aufzunehmen und sie dann alle auf einmal nach der for-Schleife anzuhängen:

vector<set<int> > add;
for (int ctr = 0; ctr < list.size(); ctr++)
{
    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++)
    {
        if (*itr == 1 || *itr == 2)
        {
            cS.clear();
            cS.insert(3);
            add.push_back(cS);
        }
    }
}
list.insert(list.end(), add.begin(), add.end());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X