Fehlermeldung
-
Das passagierLöschen ist so ein Antipattern, das hat sogar einen Wikipedia-Eintrag, wie es richtig geht:
https://en.wikipedia.org/wiki/Erase–remove_idiomZur bad_alloc: Riecht nach Endlosschleife, wenn die Streams in Fehlerzustand gehen, da die Rückgabewerte nie geprüft werden.
-
Abgesehen davon schreit das nach find_if. Statt in einer Schleife selbst nach den zu löschenden Kandidaten zu suchen kannst du das über ein Lambda erledigen. Ich kenne deinen Kenntnisstand nicht, aber früher oder später solltest du dich damit beschäftigen:
#include <algorithm> void flug::passagierLoeschen( int buchungs_nummer ) { auto predicate = [&]( Passagier const& passagier ) { return passagier.getBuchungsnummer() == buchungs_nummer; }; auto pos = std::find_if( flight.begin(), flight.end(), predicate ); if( pos != flight.end() ) { flight.erase( pos ); } }
Gibt´s Gründe dafür, dass die Liste der Passagiere
flight
, und nichtPassagiere
heißt?Edit:
SeppJ war schneller
-
@Swordfish Danke
-
@DocShoe Danke für den Tipp. Ich werd mich mal reinlesen.
Bin noch relativ neu aber du hast recht. Früher oder später, also warum nicht jetzt
-
@SeppJ Vielen Dank. Diese Art ist wirklich viel besser
-
@manni66 Stimmt. Danke
-
Ich habe es hingekriegt. Danke euch allen erstmal
Eine Frage hätte ich noch:Nach meinem Post habe ich weiter versucht das Problem zu lösen und hab nur eine ganz kleine Änderung gemacht:
void Flug::passagierLoeschen(int nr) { for(int i=0;i<flight.size();i++) { if(flight[i].getBuchungsnummer() == nr) { for(int j=i;j<flight.size()-1;j++) { // -1 um nicht überzulaufen flight[j] = flight[j+1]; } flight.pop_back(); } } }
Ich hab noch nicht viel Erfahrung, ist es so auch okay oder sollte man eher davon abraten?
-
was gibt size() zurück und was ist wenn die Anzahl 0 ist?
-
@Swordfish sagte in Fehlermeldung:
was gibt size() zurück und was ist wenn die Anzahl 0 ist?
Das geht hier gut, weil mit Anzahl 0 nichts gelöscht wird und somit die innere Schleife nicht ausgeführt wird. Es wird auch immer nur ein Eintrag gelöscht.
Aber der Einwand ist richtig.
-
@manni66 Ein vernünftig bedienter compiler sollte auf signed/unsigned mismatch in comparision hinweisen ...
-
@Swordfish sagte in Fehlermeldung:
@manni66 Ein vernünftig bedienter compiler sollte auf signed/unsigned mismatch in comparision hinweisen ...
Ja
-
Danke für eure Antworten Manni und Swordfish
Ihr seid wirklich hilfreich
-
-
@Swordfish sagte in Fehlermeldung:
@manni66 sagte in Fehlermeldung:
Ja
das meinte ich bzgl.
.size() - 1
.for (std::size_t j = i; j < flight.size()-1; j++) {
Ich wüsste nicht, wie ich den gcc hier zu einer Warnung veranlassen soll.
-
da nicht aber im originalcode.
-
@Swordfish sagte in Fehlermeldung:
da nicht aber im originalcode.
Dann verstehe ich
@Swordfish sagte in Fehlermeldung:
@manni66 sagte in Fehlermeldung:
Ja
das meinte ich bzgl.
.size() - 1
.nicht.
-
Ach menno. Bei
@TheDude sagte in Fehlermeldung:
for(int j=i;j<flight.size()-1;j++) { // -1 um nicht überzulaufen
sollte es einen signed/unsigned mismatch geben was einen eigentlich dazu bringen sollte darüber nachzudenken was bei
.size() == 0
und0 - 1
passiert.
-
@Swordfish sagte in Fehlermeldung:
Ach menno. Bei
@TheDude sagte in Fehlermeldung:
for(int j=i;j<flight.size()-1;j++) { // -1 um nicht überzulaufen
sollte es einen signed/unsigned mismatch geben was einen eigentlich dazu bringen sollte dasrüber nachzudenken was bei
.size() == 0
und0 - 1
passiert.Dazu saget ich Ja, woaruf du sagtest ...
-
@manni66 sagte in Fehlermeldung:
for (std::size_t j = i; j < flight.size()-1; j++) {
Ich wüsste nicht, wie ich den gcc hier zu einer Warnung veranlassen soll.
Überleg dir mal was das macht wenn
size() == 0
.
Det läuft dann ziemlich lange.
=>
for (std::size_t j = i; (j + 1) < flight.size(); j++) {
Bzw. noch besser
for (std::size_t j = i + 1; j < flight.size(); j++) {
und mitj-1
undj
stattj
undj + 1
arbeiten.
-
@hustbaer sagte in Fehlermeldung:
Überleg dir mal was das macht wenn size() == 0.
Das ist mir klar. Mir ist aber kein Compiler Schalter bekannt, der den Compiler hier zu einer Warnung veranlasst.