neuer Lehrer, neues Schuljahr, neues "C++"



  • volkard schrieb:

    Wenn mir einer sowas abliefert,

    int summe=0;
    
    int zahl;
    while(cin>>zahl)
       summe+=zahl;
    
    cout<<summe;
    

    wäre ich nicht wirklich sauer.

    leider hat es keinerlei vorteile ggnüber der einzeiler-lösung...



  • Doch, man muss sich nicht erst ewig sich einen Einzeiler anschauen und Klammern beachten, was wo wie verschachtelt ist. Wenn der ganze Code so aussehen würde, wäre das (zumindest bei mir, aber bestimmt auch bei anderen) ein ewiges hin und her zwischen "Entziffern des Sourcecodes", "Referenz nachschlagen" und den "Kontext dieses Algos im Programm Verstehen". Die Algorithmen der STL würde ich schon nutzen, aber nicht so dicht gepackt aufeinander.



  • Dravere schrieb:

    @C++Poser,
    Und weil eure Firma es so macht, muss es gleich für den ganzen Markt gelten, oder wie soll man dich verstehen? 🙂

    Nö, aber ich denke die Anzahl der Firmen bei denen es ähnlich aussieht dürfte um einiges größer sein, als die die viel std::accumulate usw. verwenden.
    lang:c++ std::accumulate bei Google Code search bringt gerade mal 2000 Treffer.



  • C++Poser schrieb:

    Dravere schrieb:

    @C++Poser,
    Und weil eure Firma es so macht, muss es gleich für den ganzen Markt gelten, oder wie soll man dich verstehen? 🙂

    Nö, aber ich denke die Anzahl der Firmen bei denen es ähnlich aussieht dürfte um einiges größer sein, als die die viel std::accumulate usw. verwenden.
    lang:c++ std::accumulate bei Google Code search bringt gerade mal 2000 Treffer.

    <a href= schrieb:

    c++ std::accumulate">
    8.090.000 für c++ std::accumulate

    PS: 4.060.000 für c++ std::vector

    was sagt das über den gebrauch aus?


  • Administrator

    volkard schrieb:

    Wenn mir einer sowas abliefert,

    int summe=0;
    
    int zahl;
    while(cin>>zahl)
       summe+=zahl;
    
    cout<<summe;
    

    wäre ich nicht wirklich sauer.

    Hmmm, doch. Bitte geschweifte Klammern bei der While-Schleife! 😃

    C++Poser schrieb:

    Nö, aber ich denke die Anzahl der Firmen bei denen es ähnlich aussieht dürfte um einiges größer sein, als die die viel std::accumulate usw. verwenden.

    Und mit welchen Argumenten kannst du diese Aussage untermauern? Ich kann auch einfach behaupten, dass genau der umgekehrte Fall zutrifft, dass bringt uns aber nicht weiter 😉

    C++Poser schrieb:

    lang:c++ std::accumulate bei Google Code search bringt gerade mal 2000 Treffer.

    Ich hoffe mal nicht, dass du dies als ein Argument für deine Aussage siehst 🙂

    Grüssli



  • volkard schrieb:

    Wenn mir einer sowas abliefert,

    int summe=0;
    
    int zahl;
    while(cin>>zahl)
       summe+=zahl;
    
    cout<<summe;
    

    wäre ich nicht wirklich sauer.

    Mein eigentlicher Hintergedanke war der, dass es nicht unnötig Rechenleistung verschwenden soll.
    Bei einem größeren Programm ist das glaub ich vorteilhaft, wenn man Umwege und der gleichen vermeidet. So stell ich mir das vor... kann natürlich auch komplett falsch sein.

    Grüße,
    Martin



  • unskilled schrieb:

    <a href= schrieb:

    c++ std::accumulate">
    8.090.000 für c++ std::accumulate

    PS: 4.060.000 für c++ std::vector

    was sagt das über den gebrauch aus?

    😃
    Such mal richtig
    http://www.google.de/search?hl=de&q=c%2B%2B+"std%3A%3Avector"&btnG=Suche&meta=
    http://www.google.de/search?hl=de&q=c%2B%2B+"std%3A%3Aaccumulate"&btnG=Suche&meta=



  • Aho schrieb:

    volkard schrieb:

    Wenn mir einer sowas abliefert,

    int summe=0;
    
    int zahl;
    while(cin>>zahl)
       summe+=zahl;
    
    cout<<summe;
    

    wäre ich nicht wirklich sauer.

    Mein eigentlicher Hintergedanke war der, dass es nicht unnötig Rechenleistung verschwenden soll.
    Bei einem größeren Programm ist das glaub ich vorteilhaft, wenn man Umwege und der gleichen vermeidet. So stell ich mir das vor... kann natürlich auch komplett falsch sein.

    Grüße,
    Martin

    ich kann mir gerade nicht wirklich vorstellen, dass der einzeiler langsamer ist - außerdem fällt das wohl eh unter vorzeitige optimierung...



  • unskilled schrieb:

    ich kann mir gerade nicht wirklich vorstellen, dass der einzeiler langsamer ist

    Bei sowas gehe ich davon aus, daß es exakt gleich schnell is.



  • volkard schrieb:

    unskilled schrieb:

    ich kann mir gerade nicht wirklich vorstellen, dass der einzeiler langsamer ist

    Bei sowas gehe ich davon aus, daß es exakt gleich schnell is.

    wollte ich damit sagen ;P



  • Dravere schrieb:

    volkard schrieb:

    Wenn mir einer sowas abliefert,

    int summe=0;
    
    int zahl;
    while(cin>>zahl)
       summe+=zahl;
    
    cout<<summe;
    

    wäre ich nicht wirklich sauer.

    Hmmm, doch. Bitte geschweifte Klammern bei der While-Schleife! 😃

    Da geht es doch schon los. C++ verlangt keine geschweiften Klammern. Und ich verzichte häufig in solchen Situation auf diese. Die Schleife ist so wie sie ist effizient und gut lesbar. Es spricht also nichts dagegen, es so zu schreiben.

    Die std::accumulate-Funktion ist in erster Linie für Templateprogrammierung sinnvoll. In so einer Situation, wie hier gezeigt, finde ich es eher einfach akademisch interessant.

    Im übrigen kann man (und sollte) nach accumulate den Zustand von std::cin abfragen. Dann kann man erfahren, ob man bei eof angekommen ist oder die letzte Konvertierung auf ein nicht nummerischen Wert gestossen ist. Einfach std::cin.eof() abfragen. Ist das false, ist man nicht am Ende und die letzte Konvertierung ist offensichtlich schief gelaufen:

    #include <iostream>  //std::cin / std::cout / std::endl
    #include <iterator>  //std::istream_iterator
    #include <numeric>   //std::accumulate
    
    int main()
    {
        std::cout << std::accumulate(std::istream_iterator<int> (std::cin), std::istream_iterator<int>(), 0) << std::endl;
        if (!std::cin.eof())
             std::cerr << "ups - schief gelaufen" << std::endl;
    }
    

    Und gleich nochmal was ohne gescheifte Klammern 😉 .



  • Mal abgesehen von den diversen bereits genannten Probleme bzgl. Eingabefehlern etc. finde ich den Einzeiler nicht so unheimlich schlimm. Allerdings geben ich den Kritikern recht, die die Lesbarkeit nicht so umwerfend finden. Ein oder zwei wohlplazierte Zeilenumbrüche können da Wunder wirken:

    #include <iostream>  //std::cin / std::cout / std::endl
    #include <iterator>  //std::istream_iterator
    #include <numeric>   //std::accumulate
    
    int main()
    {
        std::cout << std::accumulate(std::istream_iterator<int>(std::cin),
                                     std::istream_iterator<int>(), 
                                     0) 
                  << std::endl;
    }
    

    Machts in meinen Augen genügendlesbar - ws natürlich auch wieder Geschmackssache ist...



  • pumuckl schrieb:

    Machts in meinen Augen genügendlesbar - ws natürlich auch wieder Geschmackssache ist...

    Wo ist denn da der Unterschied?

    Wenn man diese Zeilenübrüche macht, dann nur um ausreichend zu kommentieren.

    #include <iostream>  //std::cin / std::cout / std::endl
    #include <iterator>  //std::istream_iterator
    #include <numeric>   //std::accumulate
    
    int main()
    {
        std::cout << std::accumulate(std::istream_iterator<int>(std::cin),  // wichtiger Kommentar
                                     std::istream_iterator<int>(),          // wichtiger Kommentar
                                     0)                                     // wichtiger Kommentar
                  << std::endl;
    }
    

    Besonders der zweite Parameter (Off-the-end iterator) bedarf meiner Ansicht nach eines Kommentars, da er nicht unbedingt selbstsprechend ist, wenn man es so noch nicht gesehen hat.



  • Mitleid schrieb:

    Besonders der zweite Parameter (Off-the-end iterator) bedarf meiner Ansicht nach eines Kommentars, da er nicht unbedingt selbstsprechend ist, wenn man es so noch nicht gesehen hat.

    Ne, doku lesen.

    Man kommentiert keine standard funktionen, das ist ja wahnsinn...



  • Shade Of Mine schrieb:

    Man kommentiert keine standard funktionen, das ist ja wahnsinn...

    Welchem Pamphlet ist das nun wieder entsprungen?

    Wenn es nicht intuitiv ist schreibt man den Kommentar dazu, auch wenn es irgendwo in der Doku stehen würde.


  • Mod

    Mitleid schrieb:

    Wenn es nicht intuitiv ist schreibt man den Kommentar dazu, auch wenn es irgendwo in der Doku stehen würde.

    Und wer hat das verbrochen und bestimmt, was intuitiv ist?



  • Mitleid schrieb:

    Wenn es nicht intuitiv ist schreibt man den Kommentar dazu, auch wenn es irgendwo in der Doku stehen würde.

    Du man muss also ein
    ++i;
    kommentieren.

    verstehe.

    PS:
    wenn du das accumulate nicht verstehst, dann klicke drauf und drück F1 - da hast du eine ideale doku. viel besser als alles was man im code schreiben kann.



  • camper schrieb:

    Und wer hat das verbrochen und bestimmt, was intuitiv ist?

    Ich denke es ist klar, dass man das so nicht bestimmen kann, auch wenn ich mir durch "Massentests" die Extraktion bestimmter Vorgehensweisen vorstellen könnte.

    Wenn ich jedoch meine Quelltexte "hinterlasse" versuche schon die nicht intuitiven Punkte ausreichend zu kommentieren. Maßstab ist schlicht meine Meinung. Von einer Regel, dass man Standardfunktionen nicht auch mit einem Kommentar versehen könnte/sollte hab ich noch nie gehört.

    //intuitiv
    vector<int> v;
    accumulate(v.begin(), v.end(), 0);
    
    // nicht intuitiv, würde ich kommentieren
    accumulate(istream_iterator<int> (cin), istream_iterator<int>(), 0); 
    
    // hier hingegen könnte ich (schweren Herzens) auf einen Kommentar verzichten 
    istream_iterator<int> input_iterator(cin);
    istream_iterator<int> eof;
    accumulate(input_iterator, eof, 0);
    

    Shade Of Mine schrieb:

    wenn du das accumulate nicht verstehst, dann klicke drauf und drück F1 - da hast du eine ideale doku. viel besser als alles was man im code schreiben kann.

    accumulate ist nicht das Problem. Nebenbei geht es auch nicht um verstehen/nicht verstehen sondern um ZÜGIG verstehen/nicht verstehen. Da sind Kommentare immer hilfreich. Natürlich kann man auch übertreiben, aber ich wüsste nicht warum hier ein kurzer Hinweis der den Begriff "Off-the-end iterator" enthält hinderlich bzw. Wahnsinn sein sollte.

    Wenn du ehrlich bist freust du dich auch, wenn in Quelltexten die dir unbekannte Bibliotheken verwenden ein paar Hinweise stehen, damit du das einigermaßen flüssig lesen kannst. Komm schon. Gib es zu ... 🙂



  • Mitleid schrieb:

    Von einer Regel, dass man Standardfunktionen nicht auch mit einem Kommentar versehen könnte/sollte hab ich noch nie gehört.

    Dennoch ist eine solche Regel durchaus bei der ein oder anderen Firma üblich - und zwar aus guten Grund. Kommentare helfen dabei Code zu verstehen - der inflationäre Einsatz wirkt aber Kontraproduktiv. Zudem sind Iteratoren eines der Grundprinzipien der STL, und wer zumindest grundlegende Ahnung von den STL-Algorithmen hat, braucht in dem erwähnten Fall auch keine Hilfe, oder weiß im schlimmsten Fall "F1" (oder ähnliches) zu verwenden.

    Mitleid schrieb:

    Wenn du ehrlich bist freust du dich auch, wenn in Quelltexten die dir unbekannte Bibliotheken verwenden ein paar Hinweise stehen, damit du das einigermaßen flüssig lesen kannst. Komm schon. Gib es zu ... 🙂

    Hier liegt aber eine relativ bekannte Bibliothek vor. Wobei ich persönlich das fehlende std:: vor dem Algorithmus vermisse, was für mich persönlich eine viel wichtige Information ist.



  • asc schrieb:

    Dennoch ist eine solche Regel durchaus bei der ein oder anderen Firma üblich - und zwar aus guten Grund.

    Nenn mir eine. Die schreibe ich heute noch an und frage nach einer "guten" Begründung.

    asc schrieb:

    der inflationäre Einsatz wirkt aber Kontraproduktiv.

    Ein kurzer Kommentar am Ende der Zeile ist nicht übertrieben.

    asc schrieb:

    ... und wer zumindest grundlegende Ahnung von den STL-Algorithmen hat, braucht in dem erwähnten Fall auch keine Hilfe ...

    Na ja, Hilfe braucht sowieso keiner, wenn er genug Zeit hat. Falls einer das kennt und auch selbst häufig einsetzt braucht er keine Hilfe, das ist doch klar. Falls aber nicht, kann ein Kommentar, oder eine geschickte Wahl des Variablennamens ihm in Sekunden klarmachen was da vor sich geht. Ohne F1 oder sonstigen Schnickschnack. Während dieses temporäre Objekt, tja, das steht halt da und sagt nichts.

    asc schrieb:

    Wobei ich persönlich das fehlende std:: vor dem Algorithmus vermisse, was für mich persönlich eine viel wichtige Information ist.

    Das hab ich weggelassen, in den ersten Beiträgen ist es drin.


Anmelden zum Antworten