Welche Datenstruktur für Tabellen?



  • Hallo,

    ich möchte eine Tabelle erstellen die verschieden sortiert werden soll.

    Ich möchte Objekte erstellen, die zum Beispiel folgendes enthalten:

    string bezeichner;
    int a, b, c;

    Diese Objekte sollen nun nach Variablen des Objekts absteigend sortiert werden können (natürlich nicht gleichzeitig). Also sortieren nach a, b oder c.

    Welche Datenstruktur ist hierfür am Besten geeignet und wie ist mit dieser dann ein Sortieren möglich?

    Viele Grüße



  • Für eine Tabellenzeile bietet sich ein struct/class an, für die komplette Tabelle ein vector<zeile> oder deque<zeile>. Sortieren kannst du dann mit den STL-Algorithmen (sort, stable_sort, partial_sort) und passend geschriebenen Vergleichsfunktionen:

    struct zeile
    {
      string bezeichner; 
      int a, b, c;
    }
    
    bool less_a(const zeile& l, const zeile& r)
    {
      return l.a<r.a;
    }
    
    //less_b, less_c, less_name analog dazu
    
    ...
    vector<zeile> tabelle;
    ...
    sort(tabelle.begin(),tabelle.end(),less_a);//sortieren nach Spalte a
    


  • Cool, Danke.

    Ich werd es mal so probieren.

    Der Aufruf sort(tabelle.begin(),tabelle.end(),less_a); reicht um die gesamte Spalte zu sortieren?

    Mir ist da noch was eingefallen. Die Ergebnisse möchte ich gerne in einer Datei speichern. Gibt es die Möglichkeit die Tabellen so in einer Datei zu speichern, dass die Datei in Excel schon formatiert geöffnet werden kann (bezeichner in Excel-Spalte A, a in Spalte B, usw.)?



  • einfach als textdatei mit csv endung (war irgendwas nach dem motto comma seperated v..) speicher. Durch Kommata werden die einzelnen spalten getrennt.



  • Bifinator schrieb:

    Der Aufruf sort(tabelle.begin(),tabelle.end(),less_a); reicht um die gesamte Spalte zu sortieren?

    Der sortiert sogar die komplette Tabelle gemäß der Spalte a 😉

    Mir ist da noch was eingefallen. Die Ergebnisse möchte ich gerne in einer Datei speichern. Gibt es die Möglichkeit die Tabellen so in einer Datei zu speichern, dass die Datei in Excel schon formatiert geöffnet werden kann (bezeichner in Excel-Spalte A, a in Spalte B, usw.)?

    Wie Delryn sagte: Comma Seperated Values - speichere die Elemente hintereinander durch Kommas getrennt in einer Textdatei:

    ofstream fout("out.csv");
    for(vector<zeile>::iterator p = tabelle.begin();p!=tabelle.end();++p)
      fout<<p->bezeichner<<","<<p->a<<","<<p->b<<","<<p->c<<"\n";
    


  • Vielen Dank für eure Hilfe.

    Ich werd das nun mal in Angriff nehmen.



  • Ich habe noch eine Frage zu struct.

    Ich will die Elemente die in struct gespeichert werden sollen aus einer Textdatei einlesen, weiss aber nicht vorher wie viele das sind. Wie initialisiere ich nun struct?

    Normalerweise macht man ja:

    struct a,b;
    
    a.bla = ...
    a.blu = ...
    
    usw.
    


  • Hallo

    vermutlich brauchst du ein dynamisches Array, dafür kannst du zum Beispiel std::vector nehmen.

    #include <vector>
    ...
    struct record {... };
    std::vector<record> table;
    ...
    record new;
    // Daten für new einlesen
    table.push_back(new); // neuen Datensatz in dynamisches Array anfügen
    

    Vorteil : du kannst gleich die Standard-Funktionen zum sortieren benutzen.

    bis bald
    akari



  • Habe mal wieder ein Problem.

    Ich bekomme folgende Fehlermeldung:

    no matching function for call to ‘sort(__gnu_cxx::__normal_iterator<Cartography::bundesland*, std::vector<Cartography::bundesland, std::allocatorCartography::bundesland > >, __gnu_cxx::__normal_iterator<Cartography::bundesland*, std::vector<Cartography::bundesland, std::allocatorCartography::bundesland > >, <unknown type>)’
    /usr/include/c++/4.0.2/bits/stl_algo.h:2591: note: candidates are: void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Cartography::bundesland*, std::vector<Cartography::bundesland, std::allocatorCartography::bundesland > >, _Compare = bool (Cartography::*)(const Cartography::bundesland&, const Cartography::bundesland&)]

    Woran kann das liegen?



  • Wie wärs, wenn du uns mal den Code dazu zeigst.



  • Sorry, der Code ist analog zu oben

    struct zeile
    {
      string bezeichner;
      int a, b, c;
    }
    
    bool less_a(const zeile& l, const zeile& r)
    {
      return l.a<r.a;
    }
    
    //less_b, less_c, less_name analog dazu
    
    ...
    vector<zeile> tabelle;
    ...
    sort(tabelle.begin(),tabelle.end(),less_a);//sortieren nach Spalte a
    

    Wenn ich sort(...) aufrufe erhalte ich den gerade genannten Fehler.



  • Irgendwie kann das nicht der Code sein. Wo ist denn hier Cartography::bundesland?


  • Mod

    _Compare = bool (Cartography::*)(const Cartography::bundesland&, const Cartography::bundesland&

    ich würde mal ganz frech darauf tippen, dass deine vergleichsfunktion eine nichtstatische memberfunktion ist. das kann (nat.) nicht funktionieren. mach die funktion statisch oder benutz einen funktor.



  • Der Code ist analog zu meinem nur das die Variablen umbenannt wurden.

    Meiner ist so:

    void Cartography::evaluateFederalState(char name[])
    {
    
    	vector<bundesland> v;
    
    	bundesland b;
    
    	string line, temp, query;
    	int pos;
    
    	//Filterung der relevanten Daten aus Textdatei und Speicherung im Vector
    	while(getline(sampleSource,line))
    	{
    		temp = line;
    		pos = temp.find("###");
    		if(pos > -1)
    		{
    		    temp.erase(pos);
    			b.blName = temp;
    			line.erase(0,pos+3);
    			temp = line;
    
    			pos = temp.find("###");
    			if(pos > -1)
    			{
    				temp.erase(pos);
    				b.flaeche = atof(temp.c_str());
    				line.erase(0,pos+3);	
    				b.einwohner = atof(line.c_str());
    			}
    		}
    
    		//Objekt in Vector schreiben		
    		v.push_back(b);
    	}	
    
    ...    
    sort(v.begin(),v.end(),less_flaeche);
    }
    
    bool Cartography::less_flaeche(const bundesland& l, const bundesland& r)
    {
      	return l.flaeche < r.flaeche; 
    }
    

    Die Header-Datei sieht so aus:

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    class Cartography
    {
    	private:
    		//Zeiger auf MySQL-Verbindungs-Handle
    		MYSQL *conn;
    
    		ifstream sampleSource;
    		ofstream destination;
    
    		struct bundesland
    		{
    			string blName;
    			float flaeche, einwohner, flaechenFaktor, einwohnerFaktor; 	
    			int gefUnternehmen;
    	};
    
    	public:
    		Cartography()
    		{
    			//einlesen der Textdatei mit den Bundeslanddaten
    			sampleSource.open("cartography.txt");
    
    			if(!sampleSource)
    		    {
    		        cerr << "\nFehler beim Oeffnen der Datei Fax.txt. \nDie Datei existiert" 
    		             << " moeglicherweise nicht.\n";
    		        exit(1);
    		    }
    		}
    
    		//Auswertung
    		void evaluateFederalState(char name []);	
    
    		//Hilfsmethoden zur Sortierung der Ergebnisse
    		bool less_flaeche(const bundesland& l, const bundesland& r);
    
    };
    


  • ich würde mal ganz frech darauf tippen, dass deine vergleichsfunktion eine nichtstatische memberfunktion ist. das kann (nat.) nicht funktionieren. mach die funktion statisch oder benutz einen funktor.

    Das scheint es gewesen zu sein, es funktioniert nun anscheined.

    Vielen Dank


Anmelden zum Antworten