Probleme mit Vectordeklaration innerhalb einer Klasse



  • Hallo!

    Ich wollte mir einen Vector deklarieren, nur diesmal innerhalb einer Klasse:

    vector<int> test(20);

    erhalte aber immer den Fehler 'constant' c2059 was daran liegt das ich gleich die Größe mit angeben möchte.

    Wie kann ich die Fehlermeldung umgehen?



  • Keine Größe angeben, was hat das bitte auch für einen Sinn? Ein vector vergrößert sich automatisch, wenn man ihm was zu knabbern gibt.



  • ode rin den konstruktor packen(hat aber nur sinn wenn der vector GROß wird(also ich meine richtig groß)



  • Wenn sich der Vector automatisch vergrößert woher weiß man dann wo sein Ende ist? Also wenn ich nicht explizit sage vector bla.resize(30); dann weiß doch niemand wie groß der vector ist da man bla.size() nicht anwenden kann oder?



  • klar geht bla.size();



  • Also die aktuelle Größe des Vectors kann man selbstverständlich abfragen, warum auch nicht?

    Sinn macht es, die Größe zu reservieren, wenn der Vector sehr groß werden wird. Sagen wir mal er wird immer in 64kbyte Schritten vergößert (ist von der Implementierung abhängig), dann kann es elend langsam werden, wenn man 2 mio. mal push_back(x) macht.

    Also unsinnig ist es nicht, aber ganz bestimmt nicht, weil man nicht die Größe abfragen kann (was ja geht!).



  • Mis2com schrieb:

    Keine Größe angeben, was hat das bitte auch für einen Sinn?

    Weil er denn vielleicht mit 0 vorbelegt ist?



  • CarstenJ schrieb:

    Mis2com schrieb:

    Keine Größe angeben, was hat das bitte auch für einen Sinn?

    Weil er denn vielleicht mit 0 vorbelegt ist?

    Äh, eher unwahrscheinlich. Ist natürlich von der Implementierung abhängig, aber normalerweise reserviert sich der Vector aus Performancegründen immer mehr als null Felder. Und wenn er seine Reservierung aufgebraucht hat, reserviert er gleich wieder zusätzlich einen großen Block.

    Wäre ja irgendwie blöd jedesmal zus. 1 Feld anzulegen. 😮



  • Kennt ihr nicht diese vector-Methoden:

    size_type capacity() const; // Kapazität des Vectors
    void reserve(size_type n); // Hier kann man selbst Speicherblöcke reservieren
    
    capacity() - size() // erhält man den freien Speicher im Vector
    

    Wenn man 2 MB reservieren will, macht man:

    vector<int> vec;
    vec.reserve(2000000);
    vec.size(); // ist aber immer noch null!
    


  • Versteh ich nicht?! Es ging darum dass wenn ich schreibe...

    vector<int> test(20);
    

    ...ein vector mit 20 Elementen erstellt wird, und die alle mit 0 vorbelegt sind (bzw. die Standardkonstruktoren aufgerufen werden).



  • OK, wenn er natürlich den Vector mit default-Werten füllen will, dann ist es richtig was er da machen will.

    Alternativ kann man auch in den Konstruktor der Klasse schreiben:

    vec.insert(vec.begin(), 20, 0); // 20mal den Wert null einfügen
    


  • Hallo!

    Ich wollte mir einen Vector deklarieren, nur diesmal innerhalb einer Klasse:

    vector<int> test(20);

    erhalte aber immer den Fehler 'constant' c2059 was daran liegt das ich gleich die Größe mit angeben möchte.

    Wie kann ich die Fehlermeldung umgehen?

    #include <vector>
    #include <iostream>
    
    class Test
    {
    public:
    	std::vector<int> test;
    
    	Test() : test(20)	// test mit (20) Konstruktor-Parameter initialisieren
    	{
    	}
    };
    
    int main(int argc, char* argv[])
    {
    	Test t;
    	std::cout << t.test.size();	// 20!
    
    	return 0;
    }
    

    Geht doch! 😃



  • Artchi schrieb:

    Sagen wir mal er wird immer in 64kbyte Schritten vergößert (ist von der Implementierung abhängig), dann kann es elend langsam werden, wenn man 2 mio. mal push_back(x) macht.

    Deshalb ist der optimale grow-Faktor zwischen 1,5 und 2 🙂


Anmelden zum Antworten