Vector.erase liefert unbeabsichtigte Ergebnisse
-
Das liegt daran weil deine if-Bedingung als
if ((zufallszahlen[i] == min_E) || max_E)ausgewertet wird. Wenn
max_Ewas anderes als 0 ist, dann ist die Bedingung immer wahr, wie manni66 schon sagte.
-
ok danke an euch zwei und wie umgehe ich das?
-
Zudem stimmt Dein Laufindex nach dem Löschen nicht mehr - Du überspringst u.U. ein Element.
Nimm
std::remove_if()aus<algorithm>. Erase-Remove-Idiom
-
C++Developer2000 schrieb:
ok danke an euch zwei und wie umgehe ich das?
Das Eine ist wahr, oder das Andere.
Was ist das Eine?
Was ist das Andere?
-
manni66 schrieb:
C++Developer2000 schrieb:
ok danke an euch zwei und wie umgehe ich das?
Das Eine ist wahr, oder das Andere.
Was ist das Eine?
Was ist das Andere?Das eine is die schlechteste note(max_E)
Das andere die bestte note (min_E)
und die muss ich streichen von 20 zuvor erzeugten zufallszahlen sucht er sich max_E und min_E und soll sie streichen
-
C++Developer2000 schrieb:
manni66 schrieb:
C++Developer2000 schrieb:
ok danke an euch zwei und wie umgehe ich das?
Das Eine ist wahr, oder das Andere.
Was ist das Eine?
Was ist das Andere?Das eine is die schlechteste note(max_E)
Das andere die bestte note (min_E)
und die muss ich streichen von 20 zuvor erzeugten zufallszahlen sucht er sich max_E und min_E und soll sie streichenAlso lautet die Bedingung:
Wenn 6 wahr ist oder wenn 18 wahr ist? Wirklich? Denk nach!
-
Ich würde es so machen:
auto min_max = std::minmax_element(zufallszahlen.begin(), zufallszahlen.end); zufallszahlen.erase(min_max.first); zufallszahlen.erase(min_max.second);
-
TNA schrieb:
Ich würde es so machen:
auto min_max = std::minmax_element(zufallszahlen.begin(), zufallszahlen.end); zufallszahlen.erase(min_max.first); zufallszahlen.erase(min_max.second);Da kann das erste
eraseallerdingsmin_max.secondinvalidieren.
-
auto mm = std::minmax_element(begin(v), end(v)); auto min = *mm.first, max = *mm.second; v.erase(std::remove_if(begin(v), end(v), [min,max](int x){ return x==min || x==max; }), end(v));
-
Danke @manni 66 für deinen Tipp nachzudenken
Lösung:
for (size_t i = 0; i < zufallszahlen.size(); ++i) { if (zufallszahlen[i] == min_E ||zufallszahlen[i]== max_E) { zufallszahlen.erase(zufallszahlen.begin() + i); } }
-
Dein Code überspringt aber manche Zahlen, wenn diese direkt aufeinander folgen. Wenn du es weiterhin als Schleife machen möchtest dann besser so:
auto it = zufallszahlen.begin(); while (it != zufallszahlen.end()) { if (*it == min_E || *it == max_E) it = zufallszahlen.erase(it); else ++it; }
-
Wenn du die Noten "2, 2, 2, 3, 4, 4" hast, willst du dann am Ende "2, 2, 3, 4" oder nur "3" haben? Weil deine Lösung macht letzteres, in der Schule ist es aber nur üblich, eine der schlechtesten Noten zu löschen.
-
ok danke für den hinweis, schau es mir dann mal an
-
@vorrausdenker, dessen bin ich mir bewusst und habe das im Programm auch eingebaut, nur ich hielt das für diesen Thread nicht für relevant