Unglaubwürdiger Kontrast der Einfügungsdauer von unordered_set zu set



  • #include <unordered_set>
    #include <ctime>
    #include <set>
    #include <iostream>
    
    class stop_watch
    {
        unsigned long first;
    
    public:
    
        void start()
        {
            first = clock();
        }
    
        unsigned long stop()
        {
            return clock() - first;
        }
    };
    
    int main()
    {
        stop_watch sw;
        std::set<int> stdset;
        std::unordered_set<int> stduset;
        sw.start();
    
        for(int a;a < 1000000;++a)
            stdset.insert(a);
    
        std::cout << sw.stop() << '\n';
        sw.start();
    
        for(int a;a < 1000000;++a)
            stduset.insert(a);
    
        std::cout << sw.stop() << '\n';
    }
    

    Bin ich blöd wie ein Hund, oder wieso braucht unordered_set nicht mal eine Millisekunde zum Einfügen von 1 000 000 Zahlen, set aber 1000?
    Kann das sein, dass Hash-Algorithmen und keine Sortierung die Geschwindigkeit (mehr als) vertausend-fachen?

    VD 🕶



  • Läuft es auf Debug?

    Sonst dauerts wohl eben.

    Ansonsten auch zu bedenken, dass Du im ungünstigsten Fall 1 Mio. mal Speicher erweiterst.



  • Ich Antworte mir besser gleich selber... ja ich bin blöd wie ein Hund! Da vergess ich glatt, a in der Startanweisung der Schleife zu initialisieren. Jetzt ist das Verhältnis ca. 3 zu 5.

    🙄

    Aber, aber.. definiert der Standard nicht die Automatische Null-Zuweisung eines Integralen BDT? Wenn es bspw. ein Stackobjekt ist?



  • Edit: Lieber doch keinen Kommentar...



  • Hacker schrieb:

    Aber, aber.. definiert der Standard nicht die Automatische Null-Zuweisung eines Integralen BDT? Wenn es bspw. ein Stackobjekt ist?

    Auch wenn es jetzt wenig überraschend ist: Nein...



  • XSpille schrieb:

    Hacker schrieb:

    Aber, aber.. definiert der Standard nicht die Automatische Null-Zuweisung eines Integralen BDT? Wenn es bspw. ein Stackobjekt ist?

    Auch wenn es jetzt wenig überraschend ist: Nein...

    Es werden glaub nur Variablen, die im statischen Speicher abgelegt werden und Variablen, die mit der Syntax T() erzeugt werden, automatisch mit 0 initialisiert.



  • <Klugschiss II>
    Die Syntax.
    </Klugschiss II>

    Ja, statischer Speicher wird genullt. Sonst nix.

    Und automatische Standardkonstruktoren tun's - glaube ich - auch.



  • Caligulaminus schrieb:

    <Klugschiss II>
    Die Syntax.
    </Klugschiss II>

    Danke, habs geändert.

    Caligulaminus schrieb:

    Ja, statischer Speicher wird genullt. Sonst nix.
    Und automatische Standardkonstruktoren tun's - glaube ich - auch.

    Genau das hab ich bereits erwähnt. :p



  • Gugelmoser schrieb:

    Genau das hab ich bereits erwähnt. :p

    Und ich sekundierte...



  • Ich hab mal folgenden Beitrag gesehen:

    Garantiert der Standard, dass wenn ich sowas schreibe

    int a;
    

    a dann mit 0 initialisiert wird?

    Und dann haben cooky451 und noch so ein anderer das bejaht.



  • Hacker schrieb:

    Ich hab mal folgenden Beitrag gesehen:

    Garantiert der Standard, dass wenn ich sowas schreibe

    int a;
    

    a dann mit 0 initialisiert wird?

    Und dann haben cooky451 und noch so ein anderer das bejaht.

    Kann man nicht sagen. Kommt drauf an, in welchem Scope sie definiert ist. Falls global Scope ja, ansonsten nein.


Anmelden zum Antworten