Array alphabetisch sortieren



  • Hi,

    ich arbeite an einem CD Verwaltungsprogramm, es speichert den Namen und noch weitere dinge. In meinem Prog habe ich eine Klasse CD mit einer funktion zum abrufen des namens. std::string CD::GetName()

    Im Programm erstelle ich zuerst einen CD array. Den möchte ich nach den Namen, nach dem alphapet sortieren. Wie geht das???

    Mfg Yazoo



  • Ist es ein std::vector?

    #include <algorithm>
    #include <vector>
    
    //...
    
    vector<CD> cds;
    sort(cds.begin(), cds.end());
    

    Musst dann nur noch den < Operator für die CD-Klasse überladen und fertig.



  • und dann kann ich mit cds wie mit nem array umgehen oder?
    z.B.:

    std::string name = cds[2].GetName();
    

    ich habe gemacht, was du gesagt hast, doch er meckert folgendes:

    "_function_base.h": E2093 'operator<' ist im Typ 'CD' für Argumente desselben Typs nicht
    implementiert in Funktion less<CD>::operator ()(const CD &,const CD &) const in Zeile 73
    

    habe ich was beim Operator überladen falsch gemacht?

    bool CD::operator<(const CD & someCD)
    {
      if(Name < someCD.GetName())     // Name ist die Klassen Variable
      {
        return true;
      }
      else
      {
        return false;
      }
    }
    


  • bool operator<(const CD & someCD) const{
       return Name < someCD.GetName();
    }
    

    Sollte funktionieren. Wichtig ist das die Funktion selbst als const markiert wird, also daß sie das Objekt nicht verändert.



  • komisch jetzt lässt es sich kompilieren, stürtzt aber sofort ab mit dem Beendigungs-Code -1073741819



  • ich hab ma ne debug sitzung gemacht und herausgefunden, dass das Programm nach dem aufruf der funktion

    cds[0].SetName(name);
    

    abstürtzt.

    Wie muss ich das machen das cds ein array wird.

    so klapts nicht:

    vector<CD> cds[50];
    


  • Zeig doch mal etwas zusammenhängenderen Code. (vor allem - wie groß ist dein Array und wie hast du es angelegt?)



  • CStoll schrieb:

    Zeig doch mal etwas zusammenhängenderen Code. (vor allem - wie groß ist dein Array und wie hast du es angelegt?)

    also ich habe noch nie mit vector gearbeitet.

    hier ein bisschen code vom prog:

    vector<CD> cd;
    
      ifstream data("CD.txt");
    
      if(data.good())
      {
        data >> numofcds;
    
        for(i = 0; i < numofcds; i++)
        {
          data >> name;        // Einlesen der gespeicherten CDs
          data >> fach;
          data >> typ;
    
          cd[i].SetName(name);
          cd[i].SetFach(fach);
          cd[i].SetTyp(typ);
        }
      }
      else
      {
        cout << "WARNUNG: CD.txt ist nicht vorhanden!";
      }
    
      data.close();
      data.clear();
    

    die klasse cd:

    class CD
    {
      public:
      CD();
      CD(std::string, int , int);
      ~CD();
    
      int GetFach()  const;
      std::string GetName()  const;
      int GetTyp()  const;                // Funktionen zum abfragen und speicehrn der Variablen
      void SetFach(int);
      void SetName(std::string);
      void SetTyp(int);
    
      std::string TypOut()  const;        // Ausgabe des Typs
    
      bool CheckPart(int,std::string,bool&)  const;   // überprüft ob ein teil des Namens, der eingegeben wurde vorhanden ist
      bool operator<(const CD &)  const;
    
      private:
      int Fach;
      std::string Name;
      int Typ;
    };
    
    CD::CD()
    {
      Fach = UNBEKANNT;
      Name = "unbekannt";
      Typ = UNBEKANNT;
    }
    
    CD::CD(std::string name, int fach, int typ)
    {
      Fach = fach;
      Name = name;
      typ = typ;
    }
    
    CD::~CD()
    {}
    
    int CD::GetFach()  const
    {
      return Fach;
    }
    
    std::string CD::GetName()  const
    {
      return Name;
    }
    
    int CD::GetTyp()  const
    {
      return Typ;
    }
    
    void CD::SetFach(int fach)
    {
      Fach = fach;
    }
    
    void CD::SetName(std::string name)
    {
      Name = name;
    }
    
    void CD::SetTyp(int typ)
    {
      Typ = typ;
    }
    
    std::string CD::TypOut()  const
    {
      switch(Typ)
      {
        case UNBEKANNT:
             return "unbekannte";
    
        case SPIEL:
             return "Spiele";
    
        case MUSIK:
             return "Musik";
    
        case DATEN:
             return "Daten";
    
        case FILM:
             return "Film";
    
        case PROGRAMM:
             return "Programm";
    
        default:
            return "unbekannte";
      }
    }
    
    bool CD::CheckPart(int x, std::string part, bool &someBool)  const
    {
      bool fund = false;
      int length = part.length();
    
      if(x == 0)
      {
        int y = x + 1;
        for(int i = 0; i < length; i++)
        {
          if(y < part.length())
          {
            if(Name[i] == part[y])
            {
              y++;
              fund = true;
            }
            else
            {
              fund = false;
            }
          }
        }
      }
      else
      {
        int y = x + 1;
        if(y < length)
        {
          if(someBool == false)
          {
            someBool = true;
            std::cout << "FEHLER: Der Stern darf nur am anfang oder am ende stehen!\n\n";
          }
        }
        else
        {
          length--;
          for(int i = 0; i < length; i++)
          {
            if(Name[i] == part[i])
            {
              fund = true;
            }
            else
            {
              fund = false;
              break;
            }
          }
        }
      }
      return fund;
    }
    
    bool CD::operator<(const CD & someCD) const
    {
      return Name < someCD.GetName();
    }
    


  • ich habe gerade gesehen dass Fellhuhn mich gefragt hat ob es ein vector ist...

    Es war keiner, ich dachte ich soll es zu einem machen.

    Frage ist das nu ein string?

    vector<CD> cd;
    

    Wenn nein wie mache ich das dann zu einem???

    vector<CD> cd[50];
    

    habe ich schon probiert, dann kommen jede menge fehler.



  • Yazoo schrieb:

    ich hab ma ne debug sitzung gemacht und herausgefunden, dass das Programm nach dem aufruf der funktion

    cds[0].SetName(name);
    

    abstürtzt.

    Wie muss ich das machen das cds ein array wird. ...[/cpp]

    Gar nicht.

    ich vermute ganz stark, dass Du noch gar keinen Platz bereitgestellt hast. Wenn Du einen Vector erzeugst, legt der erstmal keine Elemente an (auch keine "leeren").
    Also entweder gibst Du beim vector-Erzeugen schonmal eine gewünschte Anfangslänge mit ("Array-Style"):

    vector<CD> cds(50); // RUNDE Klammern !!
    

    oder Du nutzt, dass vector sich automatisch vergrößern kann ("Vector-Style")

    vector<CD> cds;
    
       for(i = 0; i < numofcds; i++)
        {
          data >> name;        // Einlesen der gespeicherten CDs
          data >> fach;
          data >> typ;
    
          cd.push_back(CD(name, fach, typ)); // wenn es einen geeigneten Constructor von CD gibt. 
        }
    

    Yazoo schrieb:

    so klapts nicht:

    vector<CD> cds[50];
    

    Natürlich klappt das !! Ist aber etwas Anderes als Du erwartet hast, nämlich ein Array von 50 vectoren.

    Gruß,

    Simon2.



  • Ja, da haben wir doch schon den Übeltäter: ein frisch angelegter vector<> ist erstmal leer - dem mußt du selber sagen, daß er mehr Platz anfordern soll.

    //Variante 1 - resize():
    if(data.good())
    {
      data >> numofcds;
      cd.resize(numofcds);//damit vergrößerst du den vector<> auf die benötigte Größe
    
      for(i = 0; i < numofcds; i++)
      {
        data >> name;
        data >> fach;
        data >> typ;
    
        cd[i].SetName(name);
        cd[i].SetFach(fach);
        cd[i].SetTyp(typ);
      }
    }
    
    //Variante 2 - push_back():
    if(data.good())
    {
      data >> numofcds;
    
      for(i = 0; i < numofcds; i++)
      {
        data >> name;
        data >> fach;
        data >> typ;
    
        cd.push_back(CD(name,fach,typ));//hängt die CD am Ende des vector<>s an - und vergrößert ihn automatisch mit
      }
    }
    


  • aaaaaaaaaahhhhh!!!!!!!!!

    vielen vielen dank nun ist das Prob gelöst und das Prog so gut wie vertig.

    thx


Anmelden zum Antworten