Need Help: HashTables



  • schön, und bei welcher Zeile?



  • steht doch da:

    Fehler 24 error C2440: 'Typumwandlung': 'const CString' kann nicht in 'size_t' konvertiert werden C:\Programme\Microsoft Visual Studio 8\VC\include\xhash 61

    Also in der Datei, wo das Hash Zeug definiert wird... ich kann aber mit dem Zeug nichts anfangen... zu sehr Mathematiker, zu wenig Infotiker.



  • Ich sehe hier keine 61 Zeilen sondern nur 22, mhhhhh.
    Gib mal Zeile 61.



  • Klick einfach doppelt auf die Fehlermeldung und die IDE bringt dich hoffentlich an die richtige Stelle...



  • hallo.

    wie in der fehlermeldung zu lesen ist, liegt das problem in der library, wo die hasmap definiert wurde... ich versuche mit CString zu arbeiten, und irgendwie schluckt das die lib nicht:

    template<class _Kty> inline
    	size_t hash_value(const _Kty& _Keyval)
    	{	// hash _Keyval to size_t value one-to-one
    	[b]return ((size_t)_Keyval ^ _HASH_SEED);[/b]
    	}
    

    in diesem Code Block passiert der Fehler, explizit wird auf die fette zeile verwiesen.



  • Was ist hash_map für eine Implementation?
    Von wem?

    Die Klasse gehört nämlich nicht zum C++ Standard und bei MS ist sie im Namespace stdext.

    Simon



  • theta schrieb:

    Was ist hash_map für eine Implementation?

    Ist schon mindestens seit VC 2002 dabei.

    War auch früher schon in den alten SGI STLs, ist wohl einer der Container aus der ursprünglichen STL, die es nicht in den Standard geschafft haben.

    Im neuen Standard wird sie durch unordered_map ersetzt.

    http://en.wikipedia.org/wiki/Hash_map_%28C%2B%2B%29



  • Ok, das erklärt vermutlich die Fehlermeldung, mit CString als Key braucht man wohl eine eigene Hashfunktion.

    Also besser mit unordered_map und string, so wie hier:

    http://www.oop-mit-cpp.de/stdbib_html/p31.html



  • hallo.

    danke für euren input.

    ich hab mittlerweile das ding mit der hashmap hingekriegt, ABER noch hab ich ein Problem:

    stdext::hash_map<LPCTSTR, int> hm_r;
    stdext::hash_map<LPCTSTR, int> hm_k;
    

    Damit lege ich mir die Hashmaps an.

    for( i = 0 ; i < listK_01.GetCount() ; i++ )
    	{
    		pKnot = (KnotenBasis*) listK_01.GetAt( i );
    
    		str_name = pKnot->GetName();
    
    		hm_k[(LPCTSTR)str_name] = i2;
    
    		i2++;
    	}
    

    hier befülle ich eine hashmap, die zweite wird analog befüllt.

    stdext::hash_map <LPCTSTR, int> :: const_iterator hmiter;
    

    hier baue ich mir einen iterator, der für beide maps funktionieren soll.

    int i_ndex_ki, i_ndex_kk, i_ndex_rohr;
    
    			hmiter = hm_k.find( (LPCTSTR)str_n1 );
    
    			if( hmiter == hm_k.end() )continue;
    
    			i_ndex_ki = hmiter->second;
    
    			hmiter = hm_k.find( (LPCTSTR)str_n2 );
    
    			if( hmiter == hm_k.end() )continue;
    
    			i_ndex_kk = hmiter->second;
    
    			CString str_lsx = (str_n1 + "_" + str_n2);
    
    			LPCTSTR ls1 = str_lsx;
    
    			hmiter = hm_r.find( ls1 );
    

    hier hole ich mir i_ndex_ki/kk ab (funktioniert wunderbar).
    ABER: ls1 liefert eingesetzt in find nur das ende der map... wo is mein fehler?



  • Einen LPCTSTR zu speichern halte ich für keine gute Idee, denn es kann ganz schnell passieren, dass der Speicher, auf den der Pointer zeigt, wieder gelöscht wird. So auch in deinem Code:

    str_name = pKnot->GetName();
    hm_k[(LPCTSTR)str_name] = i2;
    

    Simon



  • hallo.

    ich hab mein problem gelöst; ich kann leider die lösung nicht zeigen, da ich andre attribute benutze, als im bisher gezeigten code... und dafür müsste ich jede menge code hier reinstellen, der eigentlich nichts mit dem problem zu tun hat.

    zur technischen lösung: am eigentlichen code wurde nichts geändert, nur eben die attribute.


Anmelden zum Antworten