memory probleme: vector & set



  • hi! ich habe folgendes testprogramm gemacht, da ich eventuell ähnliches wo anders benötigte. der sinn dieses programmes wird vielleicht nicht so schnell ersichtlich sein, wo wir mal drüberhinweg sehn ....

    ich hab mir folgendes überlegt: ich möchte die vorteile von einem vector und die vorteile einer set verbinden und habe deshalb die set so geabaut, dass es ein point element erhält!

    jedenfalls bekomm ich nach 52 durchläufen einen speicherfehler und ich weiß nicht wieso??

    hier mein code:

    #include <vector>
    #include <string>
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    struct vergleich
    {
    	bool operator() (const string *s1, const string *s2) const {return *s1 > *s2;}
    	bool operator() (const string &s1, const string &s2) const {return s1 > s2;}
    };
    
    int main(void)
    {
    	printf("hello\n");
    
    	string str;
    	vector<string> vec;
    	vector<string>::iterator it;
    
    	set<string *, vergleich> dataset;
    	set<string *, vergleich>::iterator datait;
    
    	str.clear();
    	for(int i=0; i<100; i++)
    	{
    		str += "0";
    		vec.push_back(str);
    		it = vec.begin() + (vec.size()-1);
    		// datait = dataset.insert(&(*it)).first;
    		datait = dataset.insert(it._Myptr).first;
    	}
    	return 0;
    }
    

    danke für eure hilfe!



  • Erst einmal dein code compiliert überhaupt nicht.
    Wenn ich dich richtig verstehe willst du in den vector nur dann einfügen wenn du den string noch nicht eingefügt hast.
    Dein Hauptfehler ist dass du in das set pointer auf elemente im vector einfügen willst.
    Wenn der Vector aber vergrössert werden muss werden die Pointer auf seine Elemente aber ungültig -> boom.
    Es bleibt dir also nichts übrig als in set und vector strings einzufügen.
    zb. so

    #include <vector>
    #include <string>
    #include <iostream>
    #include <set>
    
    using namespace std;
    
    struct vergleich
    {
        bool operator() (const string &s1, const string &s2) const {return s1 > s2;}
    };
    
    int main(void)
    {
        printf("hello\n");
    
        string str;
        vector<string> vec;
        set<string, vergleich> dataset;
    
        str.clear();
        for(int i=0; i<100; i++) {
           if ( i % 2 )  // versuche 2 mal den gleichen string
              str += "0";
           if ( dataset.insert(str).second ) // wenn noch nicht im set
              vec.push_back(str);
        }
        cout << vec.size() << " elemente im vector " << dataset.size() << " elemente im set" << endl;
        return 0;
    }
    


  • zuerst mal danke für deine antwort!

    Erst einmal dein code compiliert überhaupt nicht.

    hab nochmals den alten code bei mir im vc++ 2005 express eingfügt und hab null errors ... 😕

    Wenn ich dich richtig verstehe willst du in den vector nur dann einfügen wenn du den string noch nicht eingefügt hast.
    

    ich glaub da hab ich mich nicht deutlich ausgedrückt, sorry.
    es ist so, dass ich alle elemente im vector und im set haben will! es ist vorab sichergestellt, dass jedes element nur einmal vorkommt! ich verwende deshalb einen stringpointer, weil dies nur ein vorab test ist und ich dann später statt dem string eine größere klasse verwenden muss und ich wegen performance/speicher gründen das object nicht zweimal im speicher ablegen kann!

    Wenn der Vector aber vergrössert werden muss werden die Pointer auf seine Elemente aber ungültig -> boom.
    Es bleibt dir also nichts übrig als in set und vector strings einzufügen.

    bleibt mir echt nichts anderes übrig als ein hoher performance aufwand? 😞

    was jedoch interessant ist, diese kombination funktioniert 🙂

    vector<string*> vec;
    vector<string*>::iterator it;
    
    set<string, vergleich> dataset;
    set<string, vergleich>::iterator datait;
    

    also wenn der vector das pointer element hat.



  • KitKat schrieb:

    zuerst mal danke für deine antwort!

    Erst einmal dein code compiliert überhaupt nicht.

    hab nochmals den alten code bei mir im vc++ 2005 express eingfügt und hab null errors ... 😕

    du verwendest implementations details deiner STL

    it._Myptr
    

    KitKat schrieb:

    was jedoch interessant ist, diese kombination funktioniert 🙂

    Ist klar. set ist wahrscheinlich als Baumstruktur implementiert. Dann wird sicher weniger bis nie rumkopiert. Verlassen kannst du dich aber wahrscheinlich nicht drauf.
    Kurt



  • Du könntest auch statt Pointern ints in der set speichern (und diese als Index auf deine vector-Elemente nutzen - da hast du zumindest selber die Kontrolle, wann die Werte ungültig werden.


Anmelden zum Antworten