vector und iterator ?
-
Hallo,
ich hab schon viel gelesen im Forum darüber, aber ich komm noch nicht ganz klar. Ich hab einen Vector angelegt, den ich mit push_back fülle. Wenn die Ermittlung über size() ergibt, das im vector z.B. mehr wie 1000 Elemente drinstehen, sollen die ersten 100 gelöscht werden. Wie mach ich das am besten?
Mein Code für den Vector sieht bis jetzt so aus://Header using std::vector; class TMTeViewer { private: struct TVal { double value; time_t time; } sTVal; vector <TVal> vValueTime; // hier gehts dann noch weiter // Funktion zum füllen des Vectors in .cpp void __fastcall TMTeViewer::SetValue(double Value, time_t Zeit) { sTVal.value = Value; sTVal.time = Zeit; vValueTime.push_back(sTVal); } // kompletten Vektor leeren void __fastcall TMTeViewer::ClearVector() { vValueTime.clear(); } // oder nur eine bestimmte Anzahl von Elementen des Vectors löschen // beginnnend am Anfang des Vectors void __fastcall TMTeViewer::ClearVector(unsigned int AnzValue) { // ich hatte es mit erase(itertor first, iterator last ) // aber das funzt nicht }
Es wäre schön wenn ihr mir einen Tip geben könntet.
-
was heißt
// ich hatte es mit erase(itertor first, iterator last )
// aber das funzt nichtWas daran hat nicht funktioniert
-
Hallo,
das ist meine derzeitige Version:
void __fastcall TMTeViewer::ClearVector(unsigned int AnzValue) { for(itValueTime = vValueTime.begin(); itValueTime <=AnzValue; ++itValueTime) { vValueTime.erase(itValueTime); } }
und da sagt er mir, das er ein Problem mit dem Vergleich itValueTime <= AnzValue hat. Ist mir auch klar.
Ich weiß eben nicht, wie ich es hinbekomme, das er eben die Schleife nur bis zu dem Element gehen lässt, wie ich es angegeben habe. In AnzValue steht die Anzahl, wieviele Elemente ich löschen will.Da fällt mir ein, rutschen die anderen Elemente dann nach? D.h. das z.B. wenn ich 100 Elemente lösche, nach der Aktion das 101 Element dann den Index 0 hat?
-
Hast Du itValueTime denn nirgends definiert?
Und wenn ich Deine zweite Frage richtig verstanden habe: Ja.
-
ela schrieb:
das ist meine derzeitige Version:
void __fastcall TMTeViewer::ClearVector(unsigned int AnzValue) { for(itValueTime = vValueTime.begin(); itValueTime <=AnzValue; ++itValueTime) { vValueTime.erase(itValueTime); } }
Wie wäre es mit:
vector <TVal>::iterator end = AnzValue < vValueTime.size() ? vValueTime.begin() + AnzValue : vValueTime.end(); vValueTime.erase(vValueTime.begin(), end);
Da fällt mir ein, rutschen die anderen Elemente dann nach?
Ja.
-
vec.erase(vec.begin(),vec.begin()+anzahl);
-
Warum willst Du eigentlich mit vector::erase(iterator) löschen; wäre nicht vector::erase(iterator, iterator) viel eher angebracht?
edit: Zu spät - die Schattenseite des Tabbed Browsing... :p
-
Hallo,
danke für die Antworten.
@ nman : itValueTime ist der Iterator und den hab ich definiert mit
vector <TVal> :: iterator itValueTime;
im Haeder.
@HumeSikkins: kanst du mir bitte Deinen Code erklären? Steht der in der FOR-Schleife?
Danke.
-
nein
void __fastcall TMTeViewer::ClearVector(unsigned int AnzValue) { vector <TVal>::iterator end = AnzValue < vValueTime.size() ? vValueTime.begin() + AnzValue : vValueTime.end(); vValueTime.erase(vValueTime.begin(), end); }
Das ist eine schöne und effiziente Version von
vector <TVal>::iterator end; if (AnzValue < vValueTime.size()) end = vValueTime.begin() + AnzValue; else end = vValueTime.end();
-
Hallo,
das hatte ich mir mit der Hilfe auch gerade herausgearbeitet.
Vielen Dank für Eure Hilfe, es funzt