Klitzekleine Frage zur einem Stringiterator



  • Hier der Code

    list<string>::iterator itString = stringListe.begin();
    string MeinString = itString; // geht nicht, warum?
    

    Früher Nachmittag und der Kopf ist dicht 😉



  • Hi,

    was erwartest du denn von dem Code? Ein Iterator ist ein Hilfsdatentyp, der einem das iterieren durch einen String gewährleistet. Dieser zeigt gewissermaßen auf den jeweiligen Teil des Objektes (hier für String zeigt der Iterator auf einzelne Chars). Erzwungenermaßen ist ein Iterator aber kein Zeiger.
    Jedenfalls ist so eine Zuweisung nicht einfach so möglich.

    MfG Eisflamme



  • Hallo,

    Um auf das Stringobjekt in der Liste zuzugreifen, musst du den Iterator
    dereferenzieren.

    mfg
    v R



  • Hm ginge es dann noch leichter als so:

    tested = itString->substr(0,itString->length());
    

    Das ist nämlich irgendwie hässlich 😞



  • alles klar das ding, danke!



  • 😮 😮 Ich schwöre er hat das hier eben compiliert:

    myString = (*itString);
    

    Jetzt gehts mit mal nicht mehr?!
    Da beißt sich irgendwas in der algorithm?

    **
    C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\algorithm(539) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl std::_Sort_0(class std::list<class std::basic_string<char,struct std::char_traits<char>,class
    std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator,class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>

    ,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *)'
    C:\Programme\Microsoft Visual Studio\VC98\INCLUDE\algorithm(546) : error C2784: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : Vorlagenargument fu
    er 'const class std::basic_string<_E,_Tr,_A> &' von 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::a
    llocator<char> > > >::iterator' konnte nicht hergeleitet werden
    **



  • Mal abgesehen davon, daß die Klammern unnötig sind ist diese Zeile vollkommen in Ordnung.



  • Wo kommt der Fehler? Hab meine Glasskugel leider daheim vergessen ;).

    mfg
    v R



  • Ja, macht die Gewohnheit wenn ich (*it)-> verwende.
    Der Fehler kommt, wie im letzten Post vermutet, aus der algorithm :D.

    Klasse:

    //#include <algorithm>
    

    Lasse ich diese Headerdatei außen vor, funktioniert alles. Nur leider brauche ich die sortfunktion 🙄 .

    Das kanns doch nicht sein oder? Könntet ihr das bei euch testen, hab ich einen Bug gefunden oder haben meine visual studio dateien einen Fehler?



  • Wie rufst du sort auf? Wie sind die Parameter? Musstest du selbst den op<
    implementieren? Wenn ja, hast du die beiden Parameter des op< als const
    deklariert?

    mfg
    v R



  • So verwende ich Sort:

    sort(stringListe.begin(),stringListe.end());

    Es wird also eine Liste voll mit strings sortiert.
    Ich habe keine eigenen Operatoren definiert / überladen.



  • Handelt sich ja um eine Liste, sry hab ich nicht dran gedacht. std::list hat
    seine eigene sort-Elementfunktion.

    mfg
    v R



  • Tatsache, danke für den Tipp.

    Aber ist das nun ein Fehler den man melden sollte oder nicht?



  • Sokleinmansiehtsiekaum schrieb:

    Tatsache, danke für den Tipp.

    Aber ist das nun ein Fehler den man melden sollte oder nicht?

    Ich hab mir mal die sort-Funktion angesehen. Es ist, IMHO, kein Fehler, da
    sort z. B. folgende Zeile hat:

    __introsort_loop(__first, __last, __lg(__last - __first) * 2);
    

    Hier meckert mein gcc, dass der op- (und an anderer Stelle der op+) nicht
    fuer __last definiert sei. Ich nehme mal an, dass haengt damit zusammen, dass
    der Speicherbereich von std::list nicht zusammenhaengend ist. Einfache
    Zeigerarithmetik ist hier nicht moeglich. Dazu muessten intern bei einem
    op+ aufruf entsprechend das naechste (bzw. n-te) Element gesucht und zurueck-
    gegeben werden.

    Ich denke mal, dass das auch Performencegruenden nicht gemacht worden ist,
    will mich da aber nicht festlegen.

    mfg
    v R



  • 😕 Jetzt rall ich das gerade nicht:

    Tatsache war doch das

    string Meinstring = *itString;

    nicht mehr ging sobald die algorithm includiert wurde.
    Und da Frage ich mich noch immer wieso ⚠



  • Schau dir nochmal deine gepostete Fehlermeldung an. Es geht hier um die sort
    Funktion, nicht um die Zuweisung.

    mfg
    v R



  • Aua alles klar danke sehr 🤡 !


Anmelden zum Antworten