Linked Liste, Speicherverwaltungsfehler



  • @cocaine schau dir mal an wie das datenobjekt ausschaut welches er benutzt, und dann sag mir, ob ein find funktionieren würd 🙄.

    wenn dann std::find_if.

    std::find_if durchsucht die liste mithilfe einer funktion die man bestimmen kann.
    mehr dazu gibts hier:
    http://www.sgi.com/tech/stl/find_if.html

    und am besten immernoch die gute alte map, dann braucht man nämlich keinen algorithmus zu benutzen und hat weniger schreibarbeit.(und in der geschwindigkeit nimmt sich das auch nicht viel)



  • otze schrieb:

    @cocaine schau dir mal an wie das datenobjekt ausschaut welches er benutzt, und dann sag mir, ob ein find funktionieren würd 🙄.

    wenn dann std::find_if.

    Hast recht. Dachte an nen operator==, aber mit dem geht's ja nur, wenn man die Elemente nicht als Pointer in die Liste legt.

    Ich schreib hier trotzdem mal ein Beispiel, damit Ritchie sieht, wie man std::find benutzen kann (ich geb auch gerne zu, daß ich erst ausprobiert hab, bevor ich dir Recht geben konnte 😉 ):

    #include <iostream>
    #include <list>
    #include <string>
    #include <algorithm>
    #include <cassert>
    
    struct MyElement
    {
    	MyElement(const char *new_name)
    		: name_(new_name)		{ }
    	MyElement(const MyElement &other)
    		: name_(other.name_)	{ }
    
    	bool operator==(const char *other)
    	{
    		return name_ == other;
    	}
    
    	std::string	name_;
    };
    
    int main()
    {
    	std::list<MyElement> lst;
    
    	lst.push_back(MyElement("Das"));
    	lst.push_back(MyElement("geht"));
    	lst.push_back(MyElement("doch"));
    	lst.push_back(MyElement("oder?"));
    
    	std::list<MyElement>::iterator it = std::find(lst.begin(), lst.end(), "geht");
    	std::cout << it->name_ << std::endl;
    
    	it = std::find(lst.begin(), lst.end(), "nioht?");
    	assert(it == lst.end());
    
    	return 0;
    }
    

    otze schrieb:

    und am besten immernoch die gute alte map, dann braucht man nämlich keinen algorithmus zu benutzen und hat weniger schreibarbeit.(und in der geschwindigkeit nimmt sich das auch nicht viel)

    Dazu müßte man aber den Namen aus dem Objekt ziehen (also als Index der Map benutzen), oder?



  • ja, würde aber keinen unterschied mehr machen 🙂



  • Hallo Leute,

    ich für zwei Tage Offline und konnte daher nicht antworten. Ist sonst nicht meiner Art. Ich werde mir gleich mal diese Funktion ansehen.

    Scheint ja auf den ersten Blick übersichtlicher zu sein.

    Muss ich aber erst mal verdauen. 😉

    Gruss



  • Tja,

    in meinem C++ gibt es keine cassert. 😮

    Was nun ?

    Gruss



  • Das von mir da oben ist nur ein Anwendungsbeispiel für std::find - nicht so nachbauen, sonst wird, sobald in der std::list ein Copy-Ctor aufgerufen wird, jedesmal der String umkopiert (und das passiert nicht selten).



  • Hi Cocaine,

    der Compiler hat mit der Zeile

    #include <cassert>

    ein Problem.

    Ist es kein lauffähiges Beispiel?

    Ich schreib hier trotzdem mal ein Beispiel, damit ... sieht, ...

    Gruss





  • Hab dich doch nicht paepstlicher als der Papst. Anscheinend ist es ein veralteter Compiler, der cassert nicht kennt. In dem Fall einfach wie gehabt assert.h verwenden.



  • Hallo bashar,

    danke für den Tip.

    Ich kenne leider nicht die ganze Ersetzungen und wusste nicht, das man hier assert.h verwenden muss.

    Gruss



  • Mein Beitrag war eigentlich an Lars gerichtet, aber der hat sich inzwischen wegeditiert.



  • Ne, soweit bin ich noch nicht gegangen... Musste mal Marcus fragen, ob ich kurz Admin werden darf... Dann vielleicht.


Anmelden zum Antworten