Frage zu std::unordered_set



  • nwp3 schrieb:

    std::set<A, [](const A &a1, const A &a2){return a1.name < a2.name;}> Aset;
    

    Das müsstest Du nochmal üben. 😉 std::set will als zweiten Templateparameter auch einen Typen haben, kein "Lambda-Objekt".

    Eisflamme schrieb:

    Vergleich's mit std::binary_search (Sortierung natürlich vorausgesetzt).

    wobei binary_search einem nur sagt, ob das Element vorhanden ist oder nicht. Was er will ist std::lower_bound -- wenn ich mich da richtig erinnere. Habe jetzt nicht nochmal extra nachgeguckt.

    Bleibt vielleicht noch zu sagen, dass bei std::set und std::map die Laufzeit auch im schlechtesten Fall O(log(n)) ist, wohingegen die Laufzeit bei std::unordered_* im Durchschnitt O(1) und im schlechtesten Fall O(n) ist, je nachdem, wie viele Hash-Kollisionen es gibt.



  • "Lambda-Objekt"

    closure-object. Allerdings ist die Idee nicht falsch - einfach den closure-type übergeben. Und dann muss noch eine Kopie des closure-objects an den Konstruktor von set übergeben werden, denn der default-Konstruktor ist deleted .

    auto cap_obj = [](int a, int b){ return a < b; };
    	std::set<int, decltype(cap_obj)> set{cap_obj};
    


  • Sone schrieb:

    "Lambda-Objekt"

    capture-object.

    Wenn du es genau haben willst, also Standardsprech, dann heißt das closure object, siehe §5.1.2/2. Ich habe aber bewusst "Lambda-Objekt" gesagt und mit Anführungszeichen umschlossen.

    Sone schrieb:

    capture-type

    Du meinst closure type. 😉



  • Ich hab mich völlig verdaddelt.* Natürlich closure. Ich habe gerade nur schon wieder etwas für das lambda-capture nach gesehen, und die Worte sind recht ähnlich.... 🙂 Das ist mir peinlich.

    *Passiert mir öfter. 😕


Anmelden zum Antworten