Frage zu StreamIteratoren



  • Hallo,
    ich habe gerade das Kapitel über Streamiteratoren im C++ Primer gelesen.
    Im Primer findet sich folgendes Beispiel:

    ostream_iterator<string> out_iter(cout, "\n");
    istream_iterator<string> in_iter(cin), eof;
    
    while(in_iter != eof)
        *out_iter++ = *in_iter++;
    

    Meiner Meinung nach ist folgende Version deutlich besser lesbar

    string str;
    while(cin>>str)
        cout<<str<<endl;
    

    Ich frage mich jetzt, welchen Sinn Streamiteratoren haben? Benutzt jemand von euch diese Iteratoren? Oder werden sie soger relativ häufig eingesetzt? und wenn ja, wann?



  • z.B. kann man Inhalte von Containern mittels std::copy wunderbar an einen ostream_iterator übergeben, der das Ganze dann auf der Konsole ausgibt. Ähnliches gilt für das Kopieren von Sequenzen von und nach fstreams etc.



  • Sobald Du die Streams mit den Algorithmen kombinierst, benötigst Du die Stream Iteratoren.

    (z.B. std::copy auf den std::cout).



  • Ja, die Stream-Iteratoren machen erstmal so keinen großen Sinn. Aber schau mal hier:

    vector<string> words;
    // ...
    
    copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n"));
    

    Man könnte so auch natürlich nicht nur in cout umkopieren, sondern in jedes andere Stream-Objekte (z.B. in ein File- oder Network-Stream).



  • Und wo liegt darin der Vorteil zu

    vector<string> words;
    //...
    
    for(size_t t=0;t!=words.size();++t)
        cout<<words[t]<<endl; //oder ein anderes ostream objekt
    

    ?



  • Streamyy schrieb:

    Und wo liegt darin der Vorteil zu

    Wo liegt der Vorteil in strcpy gegenüber while(*trg++=*src++); ?



  • [quote="Streamyy"]Meiner Meinung nach ist folgende Version deutlich besser lesbar[/quiote]
    Deine Version macht etwas völlig anderes, also ist der Vergleich strenggenommen ohnehin hinfällig 🙂



  • fill_n( ostream_iterator<string>( cout, "\n" ), 100, "Ich soll nicht mehr als Unreg posten" );
    

    😞

    Streamyy schrieb:

    Meiner Meinung nach ist folgende Version deutlich besser lesbar

    Deine Version macht etwas völlig anderes, also ist der Vergleich strenggenommen ohnehin hinfällig.

    Wo liegt der Vorteil...

    Wo der Vorteil von Funktionen im Allgemeinen liegt: Lesbarkeit und Wiederverwendbarkeit. Das oben ist ein schönes Beispiel, wie man dasselbe Werkzeug mit einer anderen Aufgabe kombiniert. Du musst den Sinn der Schleife auch nicht nochmal erfassen, wenn Du den Code lesen musst, weil dort im Klartext steht, was gemacht wird.



  • Streamyy schrieb:

    Und wo liegt darin der Vorteil zu

    vector<string> words;
    //...
    
    for(size_t t=0;t!=words.size();++t)
        cout<<words[t]<<endl; //oder ein anderes ostream objekt
    

    ?

    1. deine Schleife macht kein Copy!
    2. es ist eher ein for_each.
    3. Du schreibst die Schleife von Hand. Handgeschriebener Code ist potenziell fehlerhaft. Wenn du fertige Funktionen (wie for_each, copy etc.) benutzt, ist das Fehlerpotential kleiner, da diese Funktionen bereits von jemand anderem ausgiebig getestet und eingesetzt wurden. Punkt 1 bestätigt sich hier eindeutig!
    4. was ist wenn du die gleiche Aufgabe nochmal an anderen Stellen im Projekt bewerkstelligen mußt? Mußt du natürlich die For-Schleife nochmal von Hand schreiben! Punkt drei wiederholt sich!
    5. Ich muß erst den Schleifen-Code lesen und selber interpretieren, um festzustellen, was da gemacht wird. for_each, copy etc. sind dagegen auf den ersten Blick eindeutig was sie tun.


Anmelden zum Antworten