Datencontainer der stl



  • Hallo,

    bin auf der Suche nach einen geeignetem Datencontainer:

    Ich möchte Weltkoordinaten nach Polarwinkeln sortiern und diese in einem Container speichern.

    Das soll dann so aussehen:

    Ergeb. Sort, Name des Ortes der entspr Koordinate, Attribut1 zur Koordinate, Attribut2

    Ergeb. Sort soll der Schlüssel sein, nach dem im Container sortiert wird.

    Gelöscht wird, soweit ich das bis jetzt abschätzen kann, nie was aus meinem Container. Ich muss schnell einlesen und zugreifen können.

    Habe mir die stl angeschaut und denke doppelt verkettete Liste oder map kämen hier in Frage.
    Bei doppelt verketteter Liste sehe ich das Problem, dass ich viele Daten ca. 1000 Koordinaten mit ihren Attributen einfügen möchte. und hab gelesen: "Der eine Zeiger zeigt auf den Nachfolger, der andere auf den Vorgänger in der Liste. Das führt zu einem gewissen Mehraufwand beim Einhängen neuer Elemente."

    Wäre Map ok, gibt es andere geeignete Container?
    schon mal herzlichen Dank für Antwort



  • Hm, denke das List generell dafür geeignet ist.
    map bzw. hash_map evtl. auch.
    Evtl. hilft dir auch diese Grafik weiter, den richtigen Container zu finden.



  • danke, die Grafik ist super. Besser als ewig lesen..

    Die daten werden beim Progstart eingelesen, also ich denke das sollte möglichst schnell sein. Werde mal verkettete Liste und HashMap ausprobieren.



  • Hallo,

    ich möchte 5 Attribute zu einem Schlüssel in einer stl map abspeichern.
    z.B. Schlüssel Id attribut1, 2, 3, 4, 5.

    Dies habe ich mit multimap, stl, versucht. Verstehe ich es richtig, dass ich bei multimap nicht auf das 3. Attribut zugreifen kann. Sondern nur das Paar Schlüssel, Wert habe. Und ich dann in meinen Fall hätte:

    schlüssel A, attribut1
    schlüssel A, attribut2 ... n

    Ich benötige später aber eine Abfrage, bei der ich alle Attribute zu dem Schlüssel benötige.

    Gibt es dafür eine andere Containerklasse? Oder baue ich mir am besten, eine Klasse oder Struktur.

    std::ifstream quelle("test.nav");
        if (!quelle) {
            cerr << "Datei kann nicht geöffnet werden!\n";
            exit(-1);
    		/*	string err;
    		throw err = "File not found";*/
        }
    
    	string zeile; 
    
    	std::istream_iterator<string> afi (quelle);
    	std::istream_iterator<string> eof;
    
    	while (afi != eof) { 
    
    string a = *afi++;
    string b = *afi++;
    string c = *afi++;
    string d = *afi++;
    string e = *afi++;
    string f = *afi++;
    
    // todo speichern in map
    //map.add(Schlüssel,a,b,c,d,e,f)
    
    /* ist ok, i zähler für Zeile, kompletter Zeileninhalt im string
    		getline(quelle,zeile);
    
    		all[i] = zeile;
    		i++;
    		// hier selektieren
    		cout << i << endl;
    		multimap<int, string>::iterator it;
    
    		for( it = all.begin(); it != all.end(); it++ ) {
    			cout << "word: " << it->first << ", count: " << it->second << endl;
    		}
    		*/
    
    	}
    	quelle.close();  
    
    	//   cin.get();											// ?? Eingabe von RETURN beendet das Programm
    
    	return 0;
    }
    


  • pack doch einfach alle fünf Attribute in ein struct zusammen:

    struct data
    {
      string attrib1;
      string attrib2;
      ...
      string attrib5;
    
      data(const string& a1,const string& a2,...const string& a5)
      : attrib1(a1),attrib2(a2),...,attrib5(a5)
      {}
    }
    
    map<int,data> my_table;
    
    ...
    my_table.insert(make_pair(schluessel,data(a,b,c,d,e));
    ...
    


  • phlox81 schrieb:

    Grafik weiter, den richtigen Container zu finden.

    👍 👍 👍 Klasse Grafik ...



  • vielen Dank!!

    Ich brauche aber nicht immer alle Attribute.
    Bei der Lösung mit struct und make_pair sind doch alle Attribute zusammen dem Schlüssel zugeornet. Hab ich das richtig verstanden?

    Also ich würde z.B. gern auf das 1. und 3. Attribut zugreifen. Und dann in einer anderen Methode auf das 4. und 5.
    Hierfür müsste ich mir eine Klasse anlegen mit set/get Methoden, oder?
    Wenn ja, brauche ich die map überhaupt? Denn dann hätte jede Instanz meiner Klasse die Attribute und ich könnte mir einen Vector vom Typ der Klasse zur Zugriffsverwaltung anlegen.

    Da ich noch nie was in c++ mit oop gemacht habe, (in java schon) dachte ich ich könnt mir das sparen. und habe auf einen Container gehofft..

    viele Grüsse und danke,



  • Wozu getter? Du kannst die kompletten data-Objekte übergeben und dir in jeder Methode die Attribute rausgreifen, die du benötigst.

    (Randfrage: Was genau hast du damit eigentlich vor?)



  • danke!
    ja klar, ich war völlig falsch.
    Es funktioniert mit struct.


Log in to reply