Map Char Zeichenkette als Key speichern?



  • mmmm ich würde das aber gerne mit unsigned char machen? hab aber keine ahnung wo ich da ansetzten soll?



  • Downset schrieb:

    mmmm ich würde das aber gerne mit unsigned char machen? hab aber keine ahnung wo ich da ansetzten soll?

    also ein Variablenfeld von "unsigned char"s oder wie?
    std::vector<unsigned char> würde ich spontan vorschlagen 😉



  • verdammt geht das nicht irgendwie einfacher?
    was ich eigentlich will ist nur sone map

    map<unsigned char*, int> months;
    

    mit einem schlüssel der unsigned char sein sollte?
    und dann mit map.find( ) den wenn vorhandenen schlüssel finden?



  • Dann musst du der map mitteilen, wie du vergleichen willst:

    struct StrCmp
    {
        bool operator()(const char* lhs, const char* rhs)
        {
            return strcmp(lhs, rhs) < 0;
        }
    };
    
    map<const char*, int, StrCmp> myMap;
    


  • super thx das funzt -> mit unsigned gehts nicht mit char schon kriegt ma das auch noch irgendwie hin? das die deklaration unsigned char* heißt? ich programmier da auf einem bestehenden code und der hat unsigned chars und das will ich nicht ändern?



  • Naja, du musst jetzt strcmp für unsigned char* selbst implementieren, also etwa so:

    struct UStrCmp
    {
    	bool operator()(const unsigned char* lhs_, const unsigned char* rhs_) const
    	{
    		unsigned char* lhs = const_cast<unsigned char*>(lhs_);
    		unsigned char* rhs = const_cast<unsigned char*>(rhs_);
    		while(*lhs != 0 && *rhs != 0)
    		{
    			if(*lhs < *rhs)
    				return true;
    			if(*lhs > *rhs)
    				return false;
    			++lhs;
    			++rhs;
    		}
    		return false;
    	}
    };
    


  • thx hab was für unsigned char gefunden ->

    #include <mbstring.h>
    using namespace std;
    
    	struct StrCmp 
    { 
        bool operator()(const unsigned char* lhs, const unsigned char* rhs) const
        {		
    		if (sizeof(lhs)==sizeof(rhs)){
    			return _mbsnicmp(lhs, rhs,sizeof(lhs)) < 0; 
    		}else {
    			return false;
    		}
        } 
    };
    


  • Downset schrieb:

    thx hab was für unsigned char gefunden ->

    #include <mbstring.h>
    using namespace std;
    
    	struct StrCmp 
    { 
        bool operator()(const unsigned char* lhs, const unsigned char* rhs) const
        {		
    		if (sizeof(lhs)==sizeof(rhs)){
    			return _mbsnicmp(lhs, rhs,sizeof(lhs)) < 0; 
    		}else {
    			return false;
    		}
        } 
    };
    

    WTF??? Das würde ich umschreiben:

    bool operator()(const unsigned char* lhs, const unsigned char* rhs) const {		
    	if (true == true && true != false && false == false && false != true) {
    		return _mbsnicmp(lhs, rhs,sizeof(lhs)) < 0; 
    	}
    	else if (true != true || true == false || false != false || false == true) {
    		return !true == (false != true); 
    	}
    	else {
    		return true ? false : true;
    	}
    }
    

    Ernsthaft: sizeof(lhs)==sizeof(rhs) ist immer wahr, da du hier nur die Größe zweier Pointer vergleichst und die ist für gleiche Pointer-Typen natürlich immer identisch.

    _mbsnicmp(lhs, rhs,sizeof(lhs)) < 0;

    Der Aufruf ist sicher nicht das was du willst: du vergleichst höchstens sizeof(unsigned char*) viele Zeichen, auf einer 32-bit-Maschine also 4. Sinnvoller wäre der Einsatz der Funktion _mbsicmp.

    Zusammengefasst:

    bool operator()(const unsigned char* lhs, const unsigned char* rhs) const {		
       return _mbsicmp(lhs, rhs,) < 0; 
    }
    


  • #fachmann betreten
    * ChanServ gibt Voice-Status an windbird
    <Grober__> bool operator()(const unsigned char* lhs, const unsigned char* rhs) const {
    <Grober__> if (true == true && true != false && false == false && false != true) {
    <Grober__> return mbsnicmp(lhs, rhs,sizeof(lhs)) < 0;
    <Grober
    _> }
    <Grober__> else if (true != true || true == false || false != false || false == true) {
    <Grober__> return !true == (false != true);
    <Grober__> }
    <Grober__> else {
    <Grober__> return true ? false : true;
    <Grober__> }
    <Grober__> }
    <Besitzer> LINK ?
    <Grober__> EGAL !
    <Grober__> http://www.c-plusplus.net/forum/viewtopic-var-p-is-1262086.html#1262086



  • gROBER___._ schrieb:

    #fachmann betreten
    * ChanServ gibt Voice-Status an windbird
    <Grober__> bool operator()(const unsigned char* lhs, const unsigned char* rhs) const {
    <Grober__> if (true == true && true != false && false == false && false != true) {
    <Grober__> return mbsnicmp(lhs, rhs,sizeof(lhs)) < 0;
    <Grober
    _> }
    <Grober__> else if (true != true || true == false || false != false || false == true) {
    <Grober__> return !true == (false != true);
    <Grober__> }
    <Grober__> else {
    <Grober__> return true ? false : true;
    <Grober__> }
    <Grober__> }
    <Besitzer> LINK ?
    <Grober__> EGAL !
    <Grober__> http://www.c-plusplus.net/forum/viewtopic-var-p-is-1262086.html#1262086

    DU HAST DIE HAAAAARE SCHÖÖÖN (und die birne leer) 👎


Anmelden zum Antworten