Kann Werte in vector<int> nicht reinschreiben



  • Ja, das hab ich verstanden, aber das erzeugt weitere Probleme. Ich hab z.B. die Zeile "values[2]=2" auskommentiert. Und trotzdem kriege ich für size()=3 raus.

    values.capacity(): 0
    values.size(): 3
    values.capacity(): 3
    values.size(): 3
    

    In einem Algorithmus von mir, wo ich halt diese Funktionen benutze, muss ich ständig den Vektorinhalt zählen, und zwar von MIR eingesetzte Objekte und nicht die, die beim Compilieren "vor"erzeugt wurden durch resize()...



  • Dann hast Du vector nicht verstanden. Wenn Du den Vector auf n Elemente vergrößerst, enthält er nunmal danach n Elemente. Um Elemente als "ungültig" zu markieren, musst Du eine Eigenschaft des Elements nutzen, nicht eine des Vectors. int eignet sich da nur bedingt, es seidenn Du kannst einen int-Wert (z.B. 0 oder -1 oder ...) als ungültig definieren. Aber selbst dann musst Du durch alle Elemente durchzählen, um die Anzahl der gültigen zu ermitteln.

    Evtl. wäre eine map<size_t,int> was für Dich?


  • Mod

    lil_pingu schrieb:

    Ja, das hab ich verstanden, aber das erzeugt weitere Probleme. Ich hab z.B. die Zeile "values[2]=2" auskommentiert. Und trotzdem kriege ich für size()=3 raus.

    Lies dir NOCHMAL die Dokumentation von vector durch. resize() vergrößert tatsächlich den vector. Der wird nicht wieder kleiner, weil du ein Element nicht benutzt.

    In einem Algorithmus von mir, wo ich halt diese Funktionen benutze, muss ich ständig den Vektorinhalt zählen, und zwar von MIR eingesetzte Objekte und nicht die, die beim Compilieren "vor"erzeugt wurden durch resize()...

    Was spricht dagegen, den vector wie eigentlich vorgesehen mit push_back() und pop_back() zu füllen/leeren?



  • LordJaxom schrieb:

    Evtl. wäre eine map<size_t,int> was für Dich?

    Ich muss vector benutzen, die Datenstrukturen sind vorgegeben und mithilfe von vector implementiert.

    SeppJ schrieb:

    Was spricht dagegen, den vector wie eigentlich vorgesehen mit push_back() und pop_back() zu füllen/leeren?

    Weil ich fast die ganze Zeit Werte mittendrin reinlegen oder rausnehmen muss. Ich schaue mir am besten mal an, wie die anderen Funktionen der Datenstruktur implementiert wurden. Ich kenne ihr Ergebnis nur über Schnittstellenbeschreibung.



  • SeppJ schrieb:

    Was spricht dagegen, den vector wie eigentlich vorgesehen mit push_back() und pop_back() zu füllen/leeren?

    Würde ich auch meinen; nicht benötigte Objekte zu speichern ist etwas fragwürdig. Du kannst auch erase() und clear() zum Löschen einsetzen, je nach Anforderung halt. Allerdings rate ich dir auch, unbedingt die einzelnen Funktionen auf www.cplusplus.com nachzuschlagen und eventuell die Grundlagen im STL-Artikel nochmals genau durchzugehen.

    lil_pingu schrieb:

    Weil ich fast die ganze Zeit Werte mittendrin reinlegen oder rausnehmen muss. Ich schaue mir am besten mal an, wie die anderen Funktionen der Datenstruktur implementiert wurden. Ich kenne ihr Ergebnis nur über Schnittstellenbeschreibung.

    Kommt es bei dir auf die Reihenfolge an? Sonst kannst du std::vector sehr effizient nutzen, indem du zu löschende Elemente mit Elementen am Schluss vertauschst und dann innerhalb von O(1), also konstanter Zeitkomplexität, löschen kannst.


  • Mod

    lil_pingu schrieb:

    Weil ich fast die ganze Zeit Werte mittendrin reinlegen oder rausnehmen muss. Ich schaue mir am besten mal an, wie die anderen Funktionen der Datenstruktur implementiert wurden. Ich kenne ihr Ergebnis nur über Schnittstellenbeschreibung.

    Das klingt so, als sein std::vector da die völlig falsche Wahl. Das klingt eher nach einem Fall für std::list oder std::set. Guck mal in dem vom Nexus angegebenen Artikel oder hier:
    http://www.linuxsoftware.co.nz/containerchoice.png



  • Ich arbeite mit Harwell-Boeing-Matrizen, weil die Matrizen, die eine Simulation liefert, eben sparse matrices sind und demnach verdammt viele 0en besitzen. Ich muss halt ne Funktion implementieren, die auf dieser Matrix arbeitet. Üblicherweise werden diese Matrizen mithilfe von drei Arrays realisiert, allerdings benutzen die Leute, für die ich die Codes schreibe, stattdessen vector, da die Größe der Gleichungssysteme und demnach die Länge dieser Arrays dynamischn sein sollten...wie auch immer, die benutzen halt vector, ich muss für sie etwas implementieren, also muss ich mich an ihr framework halten. 😉

    Deshalb sollte ich schon bei der vector-bib bleiben. 🕶


  • Mod

    lil_pingu schrieb:

    Ich arbeite mit Harwell-Boeing-Matrizen, weil die Matrizen, die eine Simulation liefert, eben sparse matrices sind und demnach verdammt viele 0en besitzen. Ich muss halt ne Funktion implementieren, die auf dieser Matrix arbeitet. Üblicherweise werden diese Matrizen mithilfe von drei Arrays realisiert, allerdings benutzen die Leute, für die ich die Codes schreibe, stattdessen vector, da die Größe der Gleichungssysteme und demnach die Länge dieser Arrays dynamischn sein sollten...wie auch immer, die benutzen halt vector, ich muss für sie etwas implementieren, also muss ich mich an ihr framework halten. 😉

    Deshalb sollte ich schon bei der vector-bib bleiben. 🕶

    Ok, die Problemstellung ist somit klar. Hast du jetzt noch konkrete Fragen?



  • Im Moment keine. Aber wenn sich diesbzgl. weitere Fragen erstellen, werde ich sie in diesem Thread stellen, damit für andere, die die "Vorgeschichte" nicht kennen, der Zusammenhang ersichtlich wird.

    Vielen Dank trotzdem für eure Tipps.



  • Hallo, Leute.

    Nun hab ich doch eine Frage. Nehmen wir an, ich mache folgendes:

    // resizing vector
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main ()
    {
    	vector<int> myvector;
    	myvector.reserve(3);
    
    	return 0;
    }
    

    Der Compiler reserviert quasi Speicher für mindestens 3 Elemente oder mehr, aber Objekte hab ich noch nicht. Nehmen wir an, der Compiler hat Platz für 3 reserviert und ich füge aber mehr Elemente hinein. Kann das böse Folgen haben? Meiner Meinung nach sollte das eigentlich nicht sein, weil vector ja sowas wie ein dynam. Array ist und dem Benutzer keine Probleme machen darf/sollte...muss ich mich also um die mögliche Überschreitung des allozierten Speicherbereiches kümmern? 😕 😕 😕



  • Nein.



  • Nein, std::vector fordert automatisch neuen Speicherbereich an, wenn seine Kapazität erschöpft ist. Das einzige, was dabei Probleme machen kann, ist die verlorene Zeit. Aber lass dir gesagt sein, dass das erst ab vielen grossen Elementen (z.B. mehrere Millionen) etwas ausmacht und auch nur dann, wenn es sich um eine performancekritische Anwendung handelt, was längst nicht immer der Fall ist. Meist besteht absolut kein Grund zur Sorge, schon gar nicht, wenn es so wenige Elemente sind.

    Also füge ruhigen Gewissens Elemente hinzu. 😉


  • Mod

    Falls die Größe deines dynamischen Containers sich während des Programmverlaufs wild ändert, kann es günstiger sein, eine deque anstelle eines vectors zu verwenden, da diese effizienter beim Ändern der Größe sind.


Anmelden zum Antworten