CStrings miteinander vergleichen



  • Hi,

    ich hab einen CString und möchte diesen mit 10x anderen CStrings vergleichen. Gibt es hier nur die Möglichkeit

    CString item ("der zu vergleichende string");
    
    item.Compare(_T("mit dem ersten string"));
    
    item.Compare(_T("mit dem zweiten string"));
    
    //and so on
    

    oder gibt es eine bessere schnellere Möglichkeit? Vielleicht eine schnelle Funktion die einen String mit mehreren Vergleicht und als Ergebnis zurückliefert der wievielte String passt / identsich ist?

    Gruß
    Jakob



  • Naja fast würde ich sagen.
    Voraussetzung ist, dass der Vergleich binär erfolgen muss (also z.B. nicht case-insensitive).

    Dann kannst du ne CMap<CString, int> nehmen:

    CMap<CString, int> KnownStrings;
    
    // Vorbereitung
    
    void Prepare()
    {
        KnownStrings[_T("ein string")] = 1;
        KnownStrings[_T("ein anderer string")] = 2;
        KnownStrings[_T("noch ein string")] = 3;
        KnownStrings[_T("test234")] = 4;
        KnownStrings[_T("xxx")] = 5;
        KnownStrings[_T("yyy")] = 6;
    }
    
    // Abfrage
    
    int FindString(CString const& str)
    {
        int index = 0;
        if (KnownStrings.Lookup(str, index))
            return index;
        else
            return -1;
    }
    

    Dadurch dass CMap intern ein Hash-Table ist, sollte es (fast) egal sein, gegen wie viele Strings du vergleichen willst. Also ob das 10 oder 100 oder 10000 sind.

    Und natürlich kannst du statt dem int gleich was nehmen was bei deiner speziellen Anwendung vielleicht mehr Sinn macht. z.B. einen Zeiger auf eine Datenstruktur wo Informationen zum String drinnen stehen - was auch immer Sinn macht.



  • danke für den Tip, allerdings funktioniert es noch nicht....

    CMap<CString*, CString*, int, int> map; 
    
    CString name ("disabled"); 
    map[&name] = 1; 
    
    CString test = name; 
    
    int index = 0; 
    if (map.Lookup(&test, index)) 
        return index; 
    else 
      return -1;
    

    Es wird immer return(-1) zurückgegeben, wenn ich zum Suchen den CString test verwende.

    Mach ich da irgendetwas falsch?



  • Ja, du verwendest Zeiger, wo du keine Zeiger verwenden solltest.

    CMap<CString, CString, int, int> map; 
    
    CString name ("disabled"); 
    map[name] = 1; 
    
    CString test = name; 
    
    int index = 0; 
    if (map.Lookup(test, index)) 
        return index; 
    else 
        return -1;
    

  • Mod

    Und warum überhaupt Lookup verwenden und nicht einfach nur den operator[], der liefert 0 wenndas Item neu ist...


Anmelden zum Antworten