Template <vector>



  • Hallo,

    ich habe folgendes Problem: und zwar will ich mit hilfe des vector templates
    eine Tabelle verwalten dazu habe ich folgendes gemacht:

    class DatenVektor : public vector<Data>{};
    

    dan ein arry davon angelegt:

    DatenVektor* t = new DatenVektor[m];
    

    wenn ich jetzt push_back aufrufe:

    t[i].push_back(buchung);
    

    gib der Compiler mir folgenden Fehler aus:

    error C2039: 'push_back': Ist kein Element von 'DataListe'

    kann mir jemand sagen was ich falsch mache??
    für hilfe wäre ich sehr dankbar



  • ja, du erbst von einer klasse der standard bilbiothek



  • - Die Container der STL sind nicht zum Ableiten gedacht
    - Wenn du für vector<Data> nur einen anderen Namen hergeben willst ist ableiten sowieso nicht gut, stattdessen:

    typedef vector<Data> DatenVektor;
    

    - Pointer musst du erst dereferenzieren bevor du darauf zugreifen kannst, abkürzend kannst du statt dem . den -> operator nehmen.
    - Jetzt nimmst du schon vector und dann doch erst wieder ein Array, wieso stellst du deine Tabelle nicht als vector<vector<Data> > dar?

    MfG SideWinder



  • Du zeigst nicht den vollständigen Code.

    Der Compiler sagt etwas von DataListe, von dem ich hier überhaupt nichts sehe.

    Im übrigen sind die Standardcontainer nicht dazu gedacht davon zu erben. Kapsle den vector lieber intern und stelle passende Funktionen dazu zur Verfügung.

    Dann kannst du auch gleich ein vector von vectoren machen anstatt dann doch wieder ein Array anzulegen.



  • evox schrieb:

    gib der Compiler mir folgenden Fehler aus:

    error C2039: 'push_back': Ist kein Element von 'DataListe'

    Diese Meldung passt jetzt überhaupt nicht zum Rest des Beitrags. Außerdem wäre es von Vorteil, wenn du nicht nur einige Fragmente, sondern ein zusammenhängendes compilierbares Beispiel zeigst.

    PS: Dir ist hoffentlich klar, daß die STL-Container nicht für Vererbung vorgesehen sind? Und was genau willst du damit erreichen?



  • Außerdem: Warum verwendest du hier new? Kommst du aus Java? Dann gewöhne dir das schnell mal ab.



  • Damit die dynamische Speicherverwaltung (genauer gesagt die Zerstörung) bei abgeleiteten Klassen gut geht, muss ihre Base einen virtuellen Destruktor haben.

    EDIT: Die Container der STD bieten den nicht an...



  • vielen danke für die vielen antworten
    ich wollte halt nur einen anderen namen verwenden 🙄
    habs jetzt mit typdef gemacht und es leuft

    da ich mich nich so besonders mit templates auskennen wollt ich
    fragen ob mir jemand den sagen kann wie ich einen dynamischen vektor
    erstellen kann?

    er soll m einträge haben und nach hinten halt offen sein zum einfügen
    quasi eine m x erweiterbare matrix?

    für einen tipp wäre ich sehr dankbar



  • evox schrieb:

    wie ich einen dynamischen vektor erstellen kann?

    Was verstehst du unter einem dynamischen vector?

    quasi eine m x erweiterbare matrix?

    ne matrix ist was anderes als ein vector. Sonst hätte ich gesagt du suchst std::vector.

    Schau dir im Buch deiner Wahl mal das Kapitel über Container an.



  • also ich will wie ich das ja oben versucht hatten eine tabelle anlegen
    die m einträge groß ist (wird der funktion als argument übergeben)
    und belibig nach hinten erweitert werden kann (push_back)

    mit std:vector hast du recht das will ich aber wie?



  • evox schrieb:

    die m einträge groß ist (wird der funktion als argument übergeben)
    und belibig nach hinten erweitert werden kann (push_back)

    mit std:vector hast du recht das will ich aber wie?

    Ein vector wächst bei Bedarf (push_back), in sofern passt er wohl (wobei man bei einer bekannten Größe ihn entsprechend groß auslegen [reserve] sollte um häufige Vergrößerungen zu vermeiden).

    Du solltest erst einmal schaffen deine Fragen und Probleme konkreter und verständlicher zu beschreiben, vielleicht mit einem Minibeispiel.



  • Du kannst auch einen Vektor nehmen, der seinerseits Vektoren verwaltet:

    std::vector<std::vector<std::string> > meinedaten;
    


  • Solange man in der abgeleiteten Klasse keinen seperaten Destruktor braucht (also keine neuen Datenmember hinzufügt bzw nur PODs) spricht absolut nichts dagegen, von STL-Containern abzuleiten.



  • Ok ein bespiel:

    ich will sowas wie eine hashtabelle erstellen die eine größe m hat und in der elemente bei kollision angehängt werden also quasi

    der vector h[1][i] enthält alle elemente die den hashschlüssel 1 erhalten
    die vectoren h[2][k] alle elemente mit hashschlüssel 2 usw. bis m

    Du kannst auch einen Vektor nehmen, der seinerseits Vektoren verwaltet:

    C/C++ Code:
    std::vector<std::vectorstd::string > meinedaten;

    so hatte ich mir das gedacht nur wie lasse ich jetzt m einfließen?



  • evox schrieb:

    so hatte ich mir das gedacht nur wie lasse ich jetzt m einfließen?

    Nur falls ich dich richtig verstehe (da du dein m nicht darstellst):

    std::vector<std::vector<std::string> > meinedaten;
    // Erstes Element (h[0]] mit Vektor für die untergeordneten Elemente
    meinedaten.push_back(std::vector<std::string>());
    // Die Elemente unterhalt h[0] einfügen (Beispiel)
    for(int i=0; i<10; ++i)
        meinedaten[0].push_back("Test"); // Stellvertretend für die Werte...
    // Zugriff wäre jetzt mit h[0][0] bis h[0][9] möglich (Besser natürlich über Iteratoren).
    
    // Zweites Element (h[1]] mit Vektor für die untergeordneten Elemente
    meinedaten.push_back(std::vector<std::string>());
    //...
    

    P.S: Mehrfach korrigiert, da ich immer an dein Beispiel mit Index 1 als beginn gedacht habe, der Index beginnt in C++ aber immer mit 0.



  • asc schrieb:

    P.S: Mehrfach korrigiert, da ich immer an dein Beispiel mit Index 1 als beginn gedacht habe, der Index beginnt in C++ aber immer mit 0.

    ok sorry ich meinte natürlich der vektor soll von 0 bis m-1 laufen die
    jeweils wider vektoren enthalten



  • evox schrieb:

    asc schrieb:

    P.S: Mehrfach korrigiert, da ich immer an dein Beispiel mit Index 1 als beginn gedacht habe, der Index beginnt in C++ aber immer mit 0.

    ok sorry ich meinte natürlich der vektor soll von 0 bis m-1 laufen die
    jeweils wider vektoren enthalten

    Was in meinen Beispiel ja gezeigt wird.

    Ganz davon abgesehen... Meine Rechtschreibung mag schon nicht gut sein, aber du solltest deine Texte dennoch zweimal lesen, da sie teilweise nur schwer verständlich sind (Und Beispielsweise haben die Wörter "wider" und "wieder" eine nahezu gegensätzliche Bedeutung).



  • asc schrieb:

    std::vector<std::vector<std::string> > meinedaten;
    // Erstes Element (h[0]] mit Vektor für die untergeordneten Elemente
    meinedaten.push_back(std::vector<std::string>());
    // Die Elemente unterhalt h[0] einfügen (Beispiel)
    for(int i=0; i<10; ++i)
        meinedaten[0].push_back("Test"); // Stellvertretend für die Werte...
    // Zugriff wäre jetzt mit h[0][0] bis h[0][9] möglich (Besser natürlich über Iteratoren).
    
    // Zweites Element (h[1]] mit Vektor für die untergeordneten Elemente
    meinedaten.push_back(std::vector<std::string>());
    //...
    

    habs jetzt probiert und es ist genau das was ich wollte danke 🙂 🙂

    P.S. Sorry für die Rechtschreibung werde dran Arbeiten



  • so jetzt hab ich das nächste problem:

    hab das jetzt alles soweit eingearbeitet:

    Tabelle(int m){
         vector<DatenVektor> t ;  //typedef vector<Data> DatenVektor; 	
    
         groesse = m;
    }
    
    void Add (const Data& data)
    {
    	 unsigned int i = data.func(groesse);
    
    	ht[i].push_back(data);
    
    }
    

    func liefert mir einen schlüssel zurück (ähnlich einer hashfunktion), diese funktioniert auch.

    erstellen kann ich das auch aber beim debuggen kommt

    Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in List.exe aufgetreten.

    Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    kann mir jemand helfen? sitz schon den ganzen tag dran

    ach ja wahlweise kommt auch

    Expression: vector subscript out of range

    mit dem verweis auf

    bool _Inside(const _Ty *_Ptr) const
    		{	// test if _Ptr points inside vector
    		return (_Ptr < this->_Mylast && this->_Myfirst <= _Ptr);
    		}
    

    im vector template


  • Mod

    Was ist denn ht[i] und existiert das überhaupt? Ich wette nicht.



  • natürlich t nicht ht sorry vertippt


Anmelden zum Antworten