Vector mir CHARS Sortieren



  • Tach alle zusammen, ich hätt da nen kleines Problemchen.

    Ich hab einen Vector mit char Werten befüllt, und möchte diesen sortieren. Nun hab ich folgendes gemacht:

    static bool SortCharAufwaerts(Objkt *b1, Objkt *b2)
    {
    	if (b1->m_Charwert != b2->m_Charwert)
    	{
    		return b1->m_Charwert < b2->m_Charwert;
    	}
    	else
    	{
    		return true;
    	}
    }
    

    Wenn ich diese Funktion z.B. für long - Werte benutze, funktioniert es einwandfrei. Mit Chars gehts aber nicht, sprich, es wird kein Fehler ausgegeben es wird aber auch nicht sortiert.
    Der Aufruf der Sort-Funktion geschieht dann folgendermaßen:

    std::sort(CharVec.begin(), CharVec.end(), SortCharAufwaerts);
    

    Hat vieleicht jemand Rat, wie ich nen Vector mit Chars sortieren könnte???

    BIG THX in voraus

    Slawo



  • So wie es aussieht, stellt deine Funktion eine <=-Beziehung zwischen den übergebenen Objekten dar. sort() benötigt aber eine <-Beziehung.

    Btw, was soll überhaupt die Fallunterscheidung? Das kannst du doch mit einem einzigen Vergleich abhandeln:

    static bool SortCharAufwaerts(Objkt *b1, Objkt *b2)
    {
      return b1->m_Charwert < b2->m_Charwert;
    }
    


  • @ CStoll:

    Habs jetzt eben so versucht wie du es geschrieben hast, kommt aber nix vernünftiges bei rum. Sprich er sortiert nicht. Genauso wie vorher nach meiner Methode. Also ein Vectoreintrag besitzt einen Charwert der aus 12 Zahlen besteht. Das muß aber so sein!!!!! Ist so im Programm festgelegt!!!!!

    Vielleicht gibts da ne andere Methode das zu sortieren???

    Slawo



  • Slawo schrieb:

    Genauso wie vorher nach meiner Methode. Also ein Vectoreintrag besitzt einen Charwert der aus 12 Zahlen besteht.

    😕 Kannst du mal bitte die Definition der Klasse "Objkt" zeigen, vielleicht wird's dann verständlicher.



  • class Objkt
    {
    	public:
    		char m_Charwert[STRSIZE_CHARWERT];
    
                    ...
                    ...
            public:
                   Objkt(){};
                   ~Objkt(){};
    };
    
    typedef std::vector<Objkt*> CharPtrVec;
    

    Die Größe ist in einer anderen Datei wie folgt diefiniert:

    #define STRSIZE_CHARWERT 13
    


  • Achso, das ist ein char-Array. Das kannst du nicht mit < vergleichen (die Vergleichsoperatoren führen einen Zeiger-Vergleich durch), sondern mit strcmp() oder memcmp():

    static bool SortCharAufwaerts(Objkt *b1, Objkt *b2)
    {
      return memcmp(b1->m_Charwert,b2->m_Charwert,STRSIZE_CHARWERT-1)<0;
      //oder
      return strcmp(b1->m_Charwert,b2->m_Charwert)<0;
    }
    

    (Möglichkeit 3: Du verwendest std::string anstelle des char-Arrays)

    PS: kannst du keine sinnvolleren Namen vergeben? 😉

    Edit: Natürlich nicht cpy, sondern cmp 😃



  • Du kannst zwei char-Arrays nicht auf diese Weise vergleichen. Du vergleichst da nämlich zwei Zeiger. Dafür gibt es die Funktion strcmp. Besser wäre es allerdings du nimmst gleich std::string statt char[].
    Ansonsten

    bool SortCharAufwaerts(Objkt *b1, Objkt *b2)
    {
        return strcmp(b1->m_Charwert, b2->m_Charwert) < 0;
    }
    

    [edit] CStoll, wieso hier memcpy? [edit]



  • Hehe, mit den Namen ist das sone Sache 😉 .

    Also, was er jetzt macht, ist, das er sich nur einen CHARWERT nimmt und alles andere damit überschreibt. Sprich, in der Ausgabe ist nur ein und der gleiche Wert zu sehen.

    Hmmm.... 😕



  • Der Herr von Braunstein hatte recht, so gehts!!!!

    Vielen DANK Leute für die Hilfe !!!! 👍

    Slawo



  • Braunstein schrieb:

    [edit] CStoll, wieso hier memcpy? [edit]

    Sorry, da habe ich wohl schneller getippt als ich mitdenken konnte - habe den Fehler oben korrigiert.

    @Slawo: erwischt 😃


Anmelden zum Antworten