size_type



  • Warum geht dass hier mit dem size_type ned?

    #include <iostream>
    
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    
    int main()
    {
        string eingabe;
    
        while(getline(cin,eingabe) and eingabe != "~")
        {
            cout << eingabe << endl;
        }
    
        size_type zeichen = eingabe.size();
        cout << zeichen << endl;
    
        return 0;
    }
    

    Den Rückgabewert von size() soll man doch nur in einer Variable des Typs "size_type" ablegen? Oder hab ich da was falsch verstanden?

    MfG
    Stromberg


  • Administrator

    string::size_type size = eingabe.size();
    

    size_type ist ein Typ, welcher sich in der Klasse std::string befindet. Meistens ein typedef auf std::size_t .

    Grüssli



  • Muss ich da nun immer "string::size_type" schreiben? (was ich als aufwändig empfinde) Oder kann ich da auch "using string::size_type" machen, sodass ich das "string::" weglassen kann?

    MfG
    Stromberg


  • Administrator

    Stromberg_ schrieb:

    Muss ich da nun immer "string::size_type" schreiben? (was ich als aufwändig empfinde) Oder kann ich da auch "using string::size_type" machen, sodass ich das "string::" weglassen kann?

    Kann man nicht kürzen, soweit ich das weiss. Wäre auch ungünstig, weil std::vector::size_type existiert auch, wie std::deque::size_type oder std::wstring::size_type usw. 😉

    Wenn du aber willst, kannst du natürlich ein typedef einführen:

    typedef string::size_type string_size;
    

    Grüssli



  • Ich benutze die X::size_type-Typen eigentlich nie und nehme dafür halt size_t. Irgendwo wird dann ja doch implizit gecastet und es versaustaltet einfach den Code. Da freue ich mich übrigens wieder einmal auf "auto" 🙂



  • Du kannst eigentlich auch unsigned int nehmen. Kennt jemand eine Implementierung, wo das nicht das Gleiche wie size_t ist?



  • @Nexus: ? unsigned int ist ja noch länger als size_t (zu tippen). Warum sollte man das machen? Ist es nicht auf einigen 64-bit Systemen so, dass int (also auch unsigned int) 32-bit groß ist, die Addressen aber 64-bit groß sind? Dann wäre das schon mal ein Beispiel, bei dem unsigned int zu klein sein kann. Mit size_t ist man auf relativ sicherer Seite.

    Gruß
    Don06



  • Stimmt schon, daran hab ich gar nicht mehr gedacht. War ein blöder Einwand von mir. 😉

    (Ich bezog mich eigentlich darauf:

    Stromberg_ schrieb:

    Den Rückgabewert von size() soll man doch nur in einer Variable des Typs "size_type" ablegen?

    , aber eben zu Unrecht.)



  • Naja ... size_t ist ja nicht der Typ, in dem man Adressen speichern soll, sondern eben ein Größentyp.



  • Ja, aber in einem 64-bit Addressraum kann ein Byte-Array nunmal eine maximale Länge von 2^64 haben und diese Länge lässt sich dann hervorragend in 64-bit speichern.



  • Aber auf dem sichersten Weg ist man doch immer noch wenn man den dazugehörigen ::size_type verwendet?

    MfG
    Stromberg



  • Stromberg schrieb:

    Aber auf dem sichersten Weg ist man doch immer noch wenn man den dazugehörigen ::size_type verwendet?

    Japp, ist man - mach ich übrigens auch immer... hab bis jz auch noch niemals nen grund gehört, warum man das nicht sollte - das "argument" schreibaufwand find ich hier fehl am platz - und unübersichtlicher wird es dadurch auch nicht - ich finds eher (viel ^^) übersichtlicher... allerdings sehen meine meisten klassen auch so in etwa aus:

    class X
    {
     public:
      typedef int ValueType;
      typedef std::vector <ValueType> ContainerType;
    /*...*/
    };
    
    void X::test()
    {
     ContainerType::size_type = /*...*/;
    }
    

    also ist der nachteil von wegen "man muss zu viel ändern, wenn man nen anderen datentyp etc. nimmt" auch nicht mehr gegeben...

    sind zwar ein paar zeichen mehr als size_t aber auch nicht so extrem viel mehr und tippen muss ich wegen IntelliSense ja eh kaum mehr als size_t - und ich habe auch noch keinen Programmierer gesehen, der nur nicht schneller programmieren konnte, weil er nicht schneller tippen konnte - iwie hing es dann doch immer am denken - und an den selbst eingebauten fehlern ^^

    bb



  • Nexus schrieb:

    Du kannst eigentlich auch unsigned int nehmen.

    Nein, kann man nicht! Das ist kein korrektes C++ Programm mehr. Der typedef von size_t hat schon seine Gründe.

    Nexus schrieb:

    Kennt jemand eine Implementierung, wo das nicht das Gleiche wie size_t ist?

    Ja, jedes UNIX ist entweder ILP32 oder LP64, damit ist im 64Bit Modus sizeof(int) == 4 und sizeof(size_t) == 8.



  • Nexus schrieb:

    Du kannst eigentlich auch unsigned int nehmen. Kennt jemand eine Implementierung, wo das nicht das Gleiche wie size_t ist?

    warum kommen immer wieder leute auf die idee, andere datentypen nehen zu müssen, das bringt nix außer probleme.



  • [quote="wiesonur"]

    Nexus schrieb:

    Du kannst eigentlich auch unsigned int nehmen. Kennt jemand eine Implementierung, wo das nicht das Gleiche wie size_t ist?

    Nexus,
    am besten du schlägst dein buch ma auf, da bekommst die antwort.

    frohe weihnachten an alle :xmas1:



  • Don06 hat die Sache klargestellt und ich habe meinen Fehler eingesehen. Ich weiss auch nicht, warum jetzt alle darauf rumreiten müssen... 🙄


Anmelden zum Antworten