Leere Elemente aus Vektor bekommen ?
-
Habe einen Vektor, der Pointer speichert(über push_back()). Oft kommt es aber vor, dass ein Eintrag im Vektor gelöscht werden muss. Das habe ich mit remove_if gelöst.
Nun habe ich das Problem, dass mein Vektor nach einiger Zeit ca. 500 Einträge enthält, von denen die ersten 450 leere Plätze sind. Das ist ziemlich doof, da ich bei jedem Programmdurchlauf alle Elemente des Vektors einmal benutze. Könnte es ja so lösen, dass ich die noch gültigen Pointer an den Anfang tausche mit swap() und dann die leeren Plätze mit resize() wegschneide. Da gibt es aber doch sicher eine einfachere Lösung. Falls nicht, könntet ihr mir etwas ähnliches empfehlen, bei dem das kein Problem ist ?
Wenns nicht anders geht nehme ich einfach eine linkedlist, wollt nur bevor ich mich damit beschäftige gucken, ob es auch anders geht.
MFG playking21
-
playking21 schrieb:
Könnte es ja so lösen, dass ich die noch gültigen Pointer an den Anfang tausche mit swap() und dann die leeren Plätze mit resize() wegschneide.
Wenn ich das richtig sehe , macht die Kombination aus remove_if und range erase doch genau das oder?
-
Hier mal ein bisschen Sourcecode
void addUpdateable(std::shared_ptr<Updateable> up) { updateablesVec.push_back(std::move(up)); } void removeUpdateable(const Updateable& id) { std::remove_if(updateablesVec.begin(), updateablesVec.end(), [&] (std::shared_ptr<Updateable> p) { return p.get() == &id; }); }Und auch wenn ich das nochmal mit
return p == nullptr;ausprobiere bleiben die leeren Plätze.
Vielleicht könnte ich ja auch eine Funktion schreiben, um den neuen Pointer an den Anfang des Vektors zu setzen. Dann hätte er die leeren Stellen ja nicht mittendrin.
Bin noch Anfänger und arbeite gerade das erste mal mit Vektoren.
-
TNA schrieb:
Wenn ich das richtig sehe , macht die Kombination aus remove_if und range erase doch genau das oder?
Ja, danke. Habe deinen Hinweis gerade gar nicht verstanden, aber jetzt funktioniert alles
