STL Vector erase



  • Oops, sry...
    War zu überhastet geantwortet.
    Hab das pit->printPerson() in der ersten Schleife übersehen, ebenso wie die compare()s

    Ich hab das bei mir mal ausprobiert, und es klappt eigentlich, bis auf einen Punkt:
    In der ersten Schleife werden Sieghard und Ulrike nicht ausgegeben. Grund:

    Return value
    A random access iterator pointing to the new location of the element that followed the last element erased by the function call, which is the vector end if the operation erased the last element in the sequence.

    Quelle: http://cplusplus.com/reference/stl/vector/erase/
    Da deine for-Schleife automatisch inkrementiert, wird dieser eine Eintrag übersprungen.
    Lösung: while-Schleife:

    vector<person>::iterator pit=personen.begin();
    while(pit != personen.end()) {
        pit->printPerson ();
        fname = pit->getFirstname ();
        if ((fname.compare ("Erwin") == 0) || (fname.compare ("Jochen") == 0))
        {
            pit = personen.erase (pit);
        }
        else ++pit;
    }
    

    //edit: Deklaration von pit mit eingefügt



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Und noch was wichtiges: Rück deinen Code anständig ein. Das kann man nicht lesen und l'abra d'or hätte wahrscheinlich auch nicht so viel übersehen.



  • Was gefällt Dir nicht an meiner Art der Einrückung? Ich rücke jeden Block um 3 Leerzeichen ein und schreibe die Öffnende Klammer genau da hin. Damit stehen öffnende und schliessende Klammer genau übereinander und Blockanfang und -ende sind gut erkennbar. Die andere Schreibweise mit den öffnenden Klammern finde ich weniger gut lesbar.

    Gruss Henrik

    P.S. Umgangston


  • Mod

    khenrik schrieb:

    Was gefällt Dir nicht an meiner Art der Einrückung? Ich rücke jeden Block um 3 Leerzeichen ein und schreibe die Öffnende Klammer genau da hin. Damit stehen öffnende und schliessende Klammer genau übereinander und Blockanfang und -ende sind gut erkennbar. Die andere Schreibweise mit den öffnenden Klammern finde ich weniger gut lesbar.

    drakon meint wohl den liberalen Gebrauch von Leerzeichen in deinem Code. Wichtige Dinge stehen viel zu weit auseinander.



  • Ok, das hat mehr Konsistenz, als ich zuerst drin gesehen habe.
    Nichts desto trotz sieht es schreklich aus! Eine solche eigentümliche Einrückung ist unüblich und imo recht unlesbar. Vor allem wird dir das wohl kaum eine IDE so hinlegen. 😉 - Du machst dir also recht Mühe beim einrücken, wobei man sich bei einer anständigen IDE meist treiben lassen kann und das automatisch erledigen lassen.



  • Ich hab's gerne ein bischen Luftiger und hatte mir bei der C Programmierung ein gewisses Spaltenschema angeeignet. Das lässt sich bei C++ nur bedingt durchhalten, aber ich versuch's trotzdem.

    Erst mal Danke an alle nützlichen Beiträge.



  • khenrik schrieb:

    Ich hab's gerne ein bischen Luftiger und hatte mir bei der C Programmierung ein gewisses Spaltenschema angeeignet. Das lässt sich bei C++ nur bedingt durchhalten, aber ich versuch's trotzdem.

    Erst mal Danke an alle nützlichen Beiträge.

    Ich würde dir empfehlen das nicht zu tun. Gewöhn dir am besten eine übliches Schema an. Ansonsten wird kaum jemand deinen Code lesen können/wollen und wenn du das einem Arbeitgeber zeigst, dann wird der auch nicht unbedingt Freude dran haben, respektive du musst so oder so einen üblichen Schreibstil angewöhnen.



  • Das mit der Einrückung ist sicherlich Gewohnheitssache. Ich will halt (wie wohl die meisten) dass ein Block erkennbar da endet wo er beginnt, und das ist bei deiner Schreibweise leider nicht gegeben.

    class person
        {
        };
    

    Irgendwie denk ich da, ich hab nen Fehler reingebracht.
    Auch platzsparende Schreibweisen wie

    if( predicate1 ) {
        doSomething(25);
    } else {
        doSomething(35);
    }
    
    bool ok = false;
    do {
        askForInput(&ok);
    } while( !ok );
    

    sind schwerer leserlich:

    if( predicate1 )
        {
        doSomething(25);
        } else {
        doSomething(35);
        }
    
    bool ok = false;
    do
        {
        askForInput(&ok);
        } while( !ok );
    

    Die Absätze sind nicht mehr getrennt, alles auf einer Ebene!
    Noch schlimmer wird es bei anonymen Blöcken, um temporäre Objekte sofort nach Verlassen wieder zu zerstören:

    void fun(std::string& str)
        {
        int var = 10;
            {
            std::stringstream s;
            s << var;
            str = s.str();
            }
        }
    

    Man sieht einfach den Absatz nicht ins Auge springen!

    War vllt. jetzt etwas zu viel des Guten, aber ich hoffe du siehst, warum eigentlich jeder erst den Inhalt eines Blockes einrückt, nicht aber die Klammern.



  • l'abra d'or schrieb:

    Das mit der Einrückung ist sicherlich Gewohnheitssache. Ich will halt (wie wohl die meisten) dass ein Block erkennbar da endet wo er beginnt, und das ist bei deiner Schreibweise leider nicht gegeben.

    Seine Schreibweise ist zwar nicht die übliche Form, aber durchaus auch in Natura anzutreffen (Wenn gleich ich aus den Projekten in denen ich bislang mitgewirkt habe, andere gewohnt bin). Selbst manche IDEs unterstützen (nach einiger Konfiguration) diesen Stil.

    Ich würde sagen, die zwei üblichsten Stile sind folgende:

    // 1.
    class A {
    };
    
    int main() {
    }
    
    // 2.
    class A
    {
    };
    
    int main()
    {
    }
    

    gerade wenn es um Unixsysteme geht, habe ich aber auch Stile gesehen, die dem OP durchaus nicht unüblich sind (von den vielen Leerzeichen einmal abgesehen). Varianten gibt es von allen, ich z.B. breche Teilweise auch Parameter um (Mit Einrückung) auch wenn es selten ist das man Code mal ausdruckt sehe ich lieber alle Parameter auch bei längeren Bezeichnern ohne seitlich Scrollen zu müssen.

    Die vielen Leerzeichen gewöhnt man sich spätestens dann ab, wenn man auch gleich Kommentare zur Dokumentation (z.B. Doxygen) einsetzt (Die Dokumentation durchbricht nunmal die künstlichen Einrückung etwas).


Anmelden zum Antworten