If Anweisung wird übersprungen
-
@SeppJ sagte in If Anweisung wird übersprungen:
Es soll ja auch Leute geben, die ohne Gurt fahren…
Einige jonglieren dabei auch Kettensägen. Ganz verrückte programmieren in C++.
-
@SeppJ sagte in If Anweisung wird übersprungen:
Außer du denkst es wäre ok, im Fall eines Nicht-Auffindens eine Exception aus deiner Funktion zu werfen.
eine exception zu werfen ist doch das einzig richtige, wenn ein operator oder eine funktion theoretisch jeden beliebigen output haben kann (was einen dedizierten fehlercode verbietet). es ist auf jeden fall sinnvoller, als die map einfach aufzublähen. das kann zu fehlern führen, die jahrelang unentdeckt bleiben. just my 2 ct.
-
Nö ist nicht das einzigrichtige. Man kann auch sicherstellen, dass der Key auch in der map ist z.B. mit find.
-
-
@Tyrdal sagte in If Anweisung wird übersprungen:
Nö ist nicht das einzigrichtige. Man kann auch sicherstellen, dass der Key auch in der map ist z.B. mit find.
ob die funktion nun find oder at heißt, ist letztlich egal.
bis auf den psychologischen effekt vielleicht: at riecht nach O(1), aber find nach O(n)
-
@Jockelx sagte in If Anweisung wird übersprungen:
Oder count, was ich schöner finde.
Aber nur, wenn man wissen möchte, ob der Key enthalten ist.
Für die Frage, ob der Key enthalten und wenn ja, welchen Wert er hat (was hier im Beispiel der Fall war), will man ja nicht den Hash-Lookup doppelt durchführen (1x zum Testen, 1x zum Auslesen), wenn find es auch mit 1x (zum Testen UND zum Auslesen) erledigt.
-
@SeppJ sagte in If Anweisung wird übersprungen:
Kannst du es mal lassen, in jedem Thread Unsinn zu posten?
Unsinn? Unsinn ist Deine Anmerkung und sonst nichts.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
at riecht nach O(1), aber find nach O(n)
Wie zur Hölle kommst du denn darauf? Beide müssen den Key suchen. Warum sollte sich da was unterscheiden? Nebenbei sind diese Komplexitäten auch im Standard dokumentiert, also mehr lesen und weniger annehmen.
-
Aber insbesondere im HPC optimiert man auf Cache Hits, d.h. dann kann der Overhead von .at() zum Tragen kommen.
Du benutzt
std::map
im high-performance Sektor? Also einen red-black tree der jeden Knoten mitnew
alloziert?Und weshalb sprechen wir von Cache-hits, wo es hier um zwei Funktionen
operator[]
/at
geht, deren einziger Unterschied darin besteht, was eine branch, die im gegebenen Rahmen (Key soll bereits existieren) als "unlikely" kategorisiert wird, macht?
-
@Tyrdal sagte in If Anweisung wird übersprungen:
Wie zur Hölle kommst du denn darauf? Beide müssen den Key suchen. Warum sollte sich da was unterscheiden? Nebenbei sind diese Komplexitäten auch im Standard dokumentiert, also mehr lesen und weniger annehmen.
semantisch entspricht ein at() dem []-array-operator. da sollte nichts gesucht werden. warum eine map ein at() oder ein [] allerdings als 'suchen' oder O(n) implementiert, ist mir allerdings nicht klar.
-
@Bushmaster Wieso sollte map::operator[] dem vector::operator[] ( oder array[] ) entsprechen? Das sindoch völlig unterschiedliche Datenstrukturen?! Selbstverständlich muss man in einer map suchen, dafür ist sie doch da!
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@Tyrdal sagte in If Anweisung wird übersprungen:
Wie zur Hölle kommst du denn darauf? Beide müssen den Key suchen. Warum sollte sich da was unterscheiden? Nebenbei sind diese Komplexitäten auch im Standard dokumentiert, also mehr lesen und weniger annehmen.
semantisch entspricht ein at() dem []-array-operator. da sollte nichts gesucht werden. warum eine map ein at() oder ein [] allerdings als 'suchen' oder O(n) implementiert, ist mir allerdings nicht klar.
Wie soll das gehen, dass du prüfst, ob etwas existiert, ohne danach gesucht zu haben?
Außerdem: Wie kommst du auf O(n)? Du scheinst Maps nicht im geringsten verstanden haben, aber die Doku hast du offensichtlich auch nicht gelesen.Wieso liest du nicht zuerst die Doku, bevor du wild herum spekulierst? Zumal dir das nun schon wiederholt gesagt wurde…
-
@SeppJ sagte in If Anweisung wird übersprungen:
Wie soll das gehen, dass du prüfst, ob etwas existiert, ohne danach gesucht zu haben?
key und value sind schon vorher bekannt. man kann den zugriff optimieren. vielleicht kommt man nicht ganz auf O(1). aber fast.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@SeppJ sagte in If Anweisung wird übersprungen:
Wie soll das gehen, dass du prüfst, ob etwas existiert, ohne danach gesucht zu haben?
key und value sind schon vorher bekannt. man kann den zugriff optimieren. vielleicht kommt man nicht ganz auf O(1). aber fast.
Hör endlich auf zu spekulieren und lies, was eine Map ist!
Aber selbst ohne Lesen muss dir doch sofort klar sein, dass das Unsinn ist. Wie soll das magisch anders gehen, etwas zu finden, als etwas zu suchen? Wo soll da die Optimierung stecken? Suchen: Ich gucke, ob an der Stelle, an der es sein müsste, wirklich etwas ist. Finden: Ich hole das Ding von der Stelle, an der es sein müsste. Wie kommst du in einem der Fälle schneller oder langsamer zu der fraglichen Stelle? Denken vor Schreiben!
-
@SeppJ sagte in If Anweisung wird übersprungen:
Hör endlich auf zu spekulieren und lies, was eine Map ist!
ist schon okay. ich akzeptiere wie es ist. bitte kein streit.
-
@Bushmaster Es gibt hier keinen Streit, und erst Recht nicht von einem Mod initiiert. Versuche einfach, deine Annahmen besser zu überprüfen, bevor du Schlussfolgerungen postest.
-
@Columbo
ein mod ist auch nur ein mensch.
kein problem. ich weiß wann ich lieber still sein soll.
ist nicht der rede wert. vergesst das einfach.
-
Nur so am Rande, wenn hier schon wieder wortreich mikrooptimiert wird: Da der Mose-Code zusammen mit der Pause zwischen den Buchstaben als Zeichen ein Präfixcode ist, wäre das eventuell mal wieder eine Gelegenheit einen Trie zu verwenden. Die werden ja sonst gerne etwas stiefmütterlich behandelt
Natürlich nur, wenn man sich den Aufwand geben will, diese Datenstruktur kommt leider nicht fertig aus dem Werkzeugkasten wie die
std::map
.
-
Ich sage voraus: Die optimalste Variante wird am Ende aber doch irgendwas langweiliges wie ein flaches Array sein. Weil mickrige ~40 Code in einer einfachen, kompakten Struktur mittels Brute-Force zu behandeln ist erfahrungsgemäß immer besser als jede noch so gut skalierende Datenstruktur.
-
@SeppJ sagte in If Anweisung wird übersprungen:
Ich sage voraus: Die optimalste Variante wird am Ende aber doch irgendwas langweiliges wie ein flaches Array sein.
So einen Trie kann man auch sehr kompakt in ein flaches Array quetschen. Der Unterschied ist nur, wie man letztendlich durch dieses Array hüpft, um ans Ziel zu kommen.
Das war ehrlich gesagt auch das, woran ich bei dem Vorschlag dachte. Schliesslich ist das Morse-Alphabet ja nicht sonderlich gross. Für einen "High Performance Morse Decoder" würde ich so einem kompakten Trie auf jeden Fall mal austesten um zu sehen wie er sich gegen die Alternativen schlägt.