Iterator unter linux



  • Hallo !

    Ich habe folgendes Codestück :

    for(set<point_3>::iterator i = vertices.begin(); i != vertices.end(); i++) {
      (*i).index = index++;
    }
    

    und bekomme für das Stück (*i).index = index++; den Fehler :

    Assignment of data.member <point_3::index> in read-only structur.

    index ist vom typ long unsigned int und ist in der Klasse point_3 unter public.

    Der Fehler tritt nur unter Linux mit G++ auf. Visual Studio kann ohne Probleme kompilieren.

    Danke!



  • PinkaPanda schrieb:

    Ich habe folgendes Codestück :

    Ich weiß, das hat nichts mit dem eigentlichen Problem zu tun, aber ich würde nicht ständig unnötige Funktionsaufrufe machen [Bedingung wird vor jedem Schleifendurchlauf geprüft], und zumindestens wenn Inkremente allein für sich stehen die Präfixvariante vorziehen (Gerade da iteratoren auch nicht zwangsweise triviale Datentypen wie Zeiger sein müssen).

    Besser:

    for(set<point_3>::iterator it = vertices.begin(), end=vertices.end();
      it != end; ++it) {
        it->index = index++;
    }
    

    PinkaPanda schrieb:

    und bekomme für das Stück (*i).index = index++; den Fehler :

    Assignment of data.member <point_3::index> in read-only structur.

    Ist die Methode vielleicht const-Deklariert?

    cu André


  • Administrator

    Die Elemente eines std::set sind konstant. Sie sind schliesslich sortiert. Wenn man einfach einen anderen Wert zuweisen könnte, würde das die Sortierung aufheben. Wenn man also einen Wert verändern möchte, muss man den Wert rauskopieren, verändern, im std::set löschen und wieder einfügen.

    Grüssli


Anmelden zum Antworten