Template <vector>



  • 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


  • Mod

    Dann ändere die Frage dahin, ob t[i] existiert. Ich wette weiterhin dagegen.



  • t wird doch hier erzeugt:

    vector<DatenVektor> t
    

    oder lieg ich da falsch



  • In dem Konstruktor fehlt wahrscheinlich

    t.resize(groesse);
    

    Edit: Oder besser direkt eine Initialisierungsliste nutzen.


  • Mod

    Dann hast du ein t. Dieses hat 0 Elemente. Jedweder Zugriff auf irgendein Element von t geht daher schief.

    Darf ich dir nahelegen, erst einmal die Grundlagen zu lernen, bevor du anfängst, deine eigenen Hashmaps (wozu eigentlich? Gibt's doch schon in tr1.) zu schreiben?



  • evox schrieb:

    hab das jetzt alles soweit eingearbeitet:

    Du zeigst nur zu wenig und unvollständigen Code um deinen Fehler sicher zu lokalisieren.

    Ich kann nur raten das Tabelle ein Konstruktor ist, und Add eine Methode der Klasse. Wo wird ht deklariert und gefüllt? t ist jedenfalls eine lokale Variable die am Ende des Konstruktors wieder gelöscht wird.

    Tabelle::Tabelle(int m)  // m ist wohl kaum sprechend.
    {
      vector<DatenVektor> t; // Lokale Variable, nur in Methode gültig.
                             // Falls es einen gleichnamigen Member gibt, überdeckst
                             // du ihn hier.
      groesse = m;           // Schon etwas von einer Initialisierungsliste gehört?
    }
    
    void Tabelle::Add(const Data& data)
    {
        unsigned int i = data.func(groesse);
    
        ht[i].push_back(data); // ht ist was? und hat der äußere Vector auch
                               // das Element an der i-ten Stelle?
    }
    


  • yahendrik schrieb:

    In dem Konstruktor fehlt wahrscheinlich

    t.resize(groesse);
    

    Edit: Oder besser direkt eine Initialisierungsliste nutzen.

    das wars super vielen vielen dank



  • SideWinder schrieb:

    - Die Container der STL sind nicht zum Ableiten gedacht

    Wieso eigentlich nicht?
    'Nur' wegen den fehlenden virtuellen Destruktoren oder gibt es auch andere Gründe?


  • Mod

    XSpille schrieb:

    Wieso eigentlich nicht?
    'Nur' wegen den fehlenden virtuellen Destruktoren oder gibt es auch andere Gründe?

    Außerdem gibt es keinerlei protected-Member oder virtueller Funktionen. Du kannst folglich keine Funktionalität hinzufügen, die du nicht auch mit einer freien Funktion erreichen könntest. Daher stellt sich die Frage, wozu man dann noch erben soll.



  • XSpille schrieb:

    Wieso eigentlich nicht?

    Sie sind nicht dafür konzipiert.

    Generell hört man diesen Vorschlag vor allem von Leuten, die Funktionalitätserweiterung mit Vererbung gleichsetzen und für die globale Funktionen nicht objektorientiert sind, weil beim Aufruf kein Punkt vorkommt. Aber wir sind ja nicht in Java, wo man Stack von Vector ableitet :p


Anmelden zum Antworten