If Anweisung wird übersprungen
-
@Bushmaster Deswegen gibt es bei Containern generell
at()
UNDoperator[]()
.at()
ist immer checked,[]
ohne Rücksicht auf Verluste. Ich weiß nicht was da jetzt wo ein Nachteil sein soll wenn man freie Wahl hat.
-
@Swordfish sagte in If Anweisung wird übersprungen:
@Bushmaster Deswegen gibt es bei Containern generell
at()
UNDoperator[]()
.at()
ist immer checked,[]
ohne Rücksicht auf Verluste. Ich weiß nicht was da jetzt wo ein Nachteil sein soll wenn man freie Wahl hat.man kann schnell auf die nase fliegen, wenn man die dokumentation nicht aufmerksam liest. ich z.b. weiß erst seit gestern, welche nebeneffekte der [] einer map hat.
gut, dass es dieses forum gibt.
ich hätte [] einfach verwendet und mich gefreut. mein programm würde ein paar stunden laufen und plötzlich hätte ich dumm geguckt, wenn es wegen 'out of memory' aussteigt.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
man kann schnell auf die nase fliegen, wenn man die dokumentation nicht aufmerksam liest
Ja. Immer.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
ich hätte [] einfach verwendet und mich gefreut
Wahrscheinlich hättest du eher einen Complierfehler bekommen, da du mit [] lesen wolltest und dieses lesen natürlich in einer const-Funktion passiert und es keine const-Version von [] gibt. Spätestens da hättest du dann wohl die Doku gelesen.
-
@Jockelx sagte in If Anweisung wird übersprungen:
Wahrscheinlich hättest du eher einen Complierfehler bekommen, da du mit [] lesen wolltest und dieses lesen natürlich in einer const-Funktion passiert
ich bin keiner der sehr auf const-correctness achtet. ich hätte [] einfach 'irgendwo' lesend verwendet, unter der annahme, dass es sich wie das [] eines primitiven arrays verhält.
insofern wäre es gut, wenn der compiler bei jedem lesenden map-zugriff mit [] eine warnung ausgibt 'possibly inflates your map - use at() instead'
solche warnungen kenne ich von intellij-idea für java.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
use at() instead
Das ist aber eine schlechte Empfehlung.
-
@manni66 sagte in If Anweisung wird übersprungen:
@Bushmaster sagte in If Anweisung wird übersprungen:
use at() instead
Das ist aber eine schlechte Empfehlung.
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@manni66 sagte in If Anweisung wird übersprungen:
@Bushmaster sagte in If Anweisung wird übersprungen:
use at() instead
Das ist aber eine schlechte Empfehlung.
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
Nein, aber es macht nicht, was du denkst. Außer du denkst es wäre ok, im Fall eines Nicht-Auffindens eine Exception aus deiner Funktion zu werfen. Mag in seltenen Sonderfällen gewünscht sein, im typischen Anwendungsfall aber nicht.
@Bushmaster sagte in If Anweisung wird übersprungen:
ich bin keiner der sehr auf const-correctness achtet.
Es soll ja auch Leute geben, die ohne Gurt fahren…
-
@Bushmaster sagte in If Anweisung wird übersprungen:
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
Nein, aber es ist potentiell langsamer. Es wird von einigen Befürwortern zwar bestritten, dass es langsamer ist, und dafür werden gern Trivialbeispiele angeführt. Aber insbesondere im HPC optimiert man auf Cache Hits, d.h. dann kann der Overhead von
.at()
zum Tragen kommen.
-
@john-0 sagte in If Anweisung wird übersprungen:
@Bushmaster sagte in If Anweisung wird übersprungen:
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
Nein, aber es ist potentiell langsamer. Es wird von einigen Befürwortern zwar bestritten, dass es langsamer ist, und dafür werden gern Trivialbeispiele angeführt. Aber insbesondere im HPC optimiert man auf Cache Hits, d.h. dann kann der Overhead von
.at()
zum Tragen kommen.Kannst du es mal lassen, in jedem Thread Unsinn zu posten?
-
@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.