dynamische Felder?



  • heo

    gibt es in c++ eigentlich ein Möglichkeit dynamisch wachsende Felder zu benutzen oder hat jemand einen gute Implementierungsvorschlag?

    btw kann [] überladen?

    mfg



  • ja, man kann den operator überladen und es gibt so was wie vector oder diverse andere stl typen, die dynamisch wachsen



  • d3f3nd3r schrieb:

    heo

    gibt es in c++ eigentlich ein Möglichkeit dynamisch wachsende Felder zu benutzen oder hat jemand einen gute Implementierungsvorschlag?

    Ja, gibt es - und ich habe sogar eine fertige Implementation für dich: std::vector<> oder std::deque<>.

    btw kann [] überladen?

    Kannst du - sogar mit einem beliebigen Datentyp als Index 😉



  • Also such einfach mal danach ... es ist nicht schwer ... einfach den Heap nutzen und schon geht es 🙂

    Und zum operator

    template<typename T>
    class foo
    {
        T* m_data;
        std::size_t m_size;
    
    public:
        foo(std::size_t size) : m_size(size), m_data(new T[size]) {}
        ~foo() { delete [] m_data; }
        T const& operator[](std::size_t index) const { if (index >= m_size) throw std::out_of_range("index"); return m_data[index]; }   
        T& operator[](std::size_t index) { if (index >= m_size) throw std::out_of_range("index"); return m_data[index]; }   
    };
    

    ...

    foo<int> inst(100);
    inst[10] = 10;
    std::cout << inst[10] << std::endl;
    

    wobei jetzt natürlich die nicht-const Version des operators aufgerufen wird!



  • ja man könnte für jedes neues element einfach feld + 1 Speicher allocieren und dann die werte aus dem alten feld ins neue schreibn......

    aber ich suche eine effizientere Methode !?

    mfg



  • d3f3nd3r schrieb:

    ja man könnte für jedes neues element einfach feld + 1 Speicher allocieren und dann die werte aus dem alten feld ins neue schreibn......

    aber ich suche eine effizientere Methode !?

    Vector oder andere STL-Container benutzen.

    (D)Evil: Du erfindest das Rad gern jeden Tag neu, was? 😉



  • LordJaxom schrieb:

    (D)Evil: Du erfindest das Rad gern jeden Tag neu, was? 😉

    Eigentlich nich zum lachen! 🙄



  • ähm noch eine Frage, kann es sein dass man in einem vector keine zeiger speichern kann??

    folgender code produziert darauffolgende Fehlermeldung :

    #define p_d3string *d3string;
    
    #include <vector> 
    #include <iostream>
    using namespace std; 
    #include "classes/dstring/d3string.h" 
    #include "classes/fs_operators/fs_operators.h" 
    
    int main (void) {
    	vector<p_d3string> v1;
    
    vector_test.cpp: In function ‘int main()’:
    vector_test.cpp:32: error: `*' cannot appear in a constant-expression
    vector_test.cpp:32: error: template argument 1 is invalid
    vector_test.cpp:32: error: template argument 2 is invalid
    vector_test.cpp:32: error: expected primary-expression before ‘>’ token
    vector_test.cpp:32: error: ‘v1’ was not declared in this scope
    

    funzt das einfach nicht oder ist mein code fehlerhaft?

    mfg



  • ähm noch eine Frage, kann es sein dass man in einem vector keine zeiger speichern kann??

    Nein, das kann nicht sein.

    1. verwende keine #define, sondern typedef. (allg. hinweis)
    2. wie sieht die deklaration / definition von d3string aus? Auch ein template?
    wenn ja, versuchs so:

    vector<p_d3string > v1;
    

    (mit space vor dem '>').

    simon



  • Was issen das für ein Horror-Code? 😮
    Seit wann benutzt man in C++ Makros?
    Seit wann verfrachtet man freiwillig einen Header in einen anderen Namespace?

    Brrr! 👎

    Und ja, man kann in einem Vector Pointer speichern. Wenn man aber schon in der ersten Programmzeile Mist baut, rächt sich das später!

    #include "classes/dstring/d3string.h"
    #include "classes/fs_operators/fs_operators.h"
    // Standard-Header würde ich immer als letztes inkludieren...
    #include <vector>
    #include <iostream>
    
    using namespace std; // UNTER den Includes!
    
    int main (void) {
        vector<p_d3string*> v1; // ein Makro ist unsinnig... hau den Stern so rein
    

    Der Stern gehört rechts hin.



  • simon.gysi schrieb:

    2. wie sieht die deklaration / definition von d3string aus? Auch ein template?
    wenn ja, versuchs so:

    vector<p_d3string > v1;
    

    (mit space vor dem '>').

    Das mit dem Space ist in einer ganz anderen Situation nötig. Hat nichts mit Pointern zu tun.



  • ja danke war ein denkfehler,

    kein plan wieso ich nicht gleich

    vector<d3string*> v1;
    

    genommen habe 😞

    war anscheinend gestern am abend ein bisschen verwirrt....

    aber danke

    und das sollte eigentlich nur ein testprogramm werden um mit der vector lib vertraut zu werden



  • @Artchi

    Das mit dem Space ist in einer ganz anderen Situation nötig. Hat nichts mit Pointern zu tun.

    Ja, stimmt 🙂


Anmelden zum Antworten