If Anweisung wird übersprungen
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@Swordfish sagte in If Anweisung wird übersprungen:
Weil es so spezifiziert ist daß operator einen key einfügt und defaultvalue-initialisiert wenn er nicht existiert?
bloß welcher sinn mag dahinter stecken?
Damit du Zuweisungen
my_map[y] = z
machen kannst, ohne dass dir ein Fehler um die Ohren knallt, wenny
noch nicht drin ist.
-
@SeppJ wieso keine exception werfen? dafür sind die doch da.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@SeppJ wieso keine exception werfen? dafür sind die doch da.
Liest du überhaupt?
Damit du Zuweisungen my_map[y] = z machen kannst … wenn y noch nicht drin ist.
!
-
@SeppJ sagte in If Anweisung wird übersprungen:
Damit du Zuweisungen my_map[y] = z machen kannst … wenn y noch nicht drin ist.
der nachteil ist aber, dass man bei 'falschen' lesezugriffen die map sinnlos aufbläht. so ein verhalten finde ich suboptimal. was lernen wir daraus? besser finger weg von operator[] einer std:map. es gibt ja ersatz: https://en.cppreference.com/w/cpp/container/map/at
-
@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.