PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Container - MAP


Durcairion
2006-01-16, 18:11:54
Ich hoffe das mir jemand weiterhelfen kann:

Ich habe ein Bank Projekt mit den Klassen

Konto

und 2 Vererbten Klassen Sparkonto und Girokonto

Nun soll ich alle angelegten Konten egal ob Spar oder Giro in einer MAP speichern.

In meiner main() habe ich z.B. nach 2 Konten die Zeiger auf diese:

Sparkonto& konto1 = bank.createSparkonto(kunde1);
Girokonto& konto2 = bank.createGirokonto(kunde2);

Kann mir jemand sagen wie man diese nun an einer Map übergibt und wie man die Map anlegen muss?

Ich werd aus den Büchern die ich habe einfach nicht schlau :(

Gast
2006-01-16, 18:16:49
Referenz oder Zeiger in der Map speicher, keine Objekte. Einfügen geht bei std::map elegant über den op[] oder map::insert mit make_pair(a,b)

Greetings

zeckensack
2006-01-16, 18:19:58
1)Die Superklasse Konto sollte ein ADT sein (dh mindestens eine, aber besser noch so viele Funktionen wie möglich sind pure virtual), damit auch später noch Sparkonto und Girokonto dynamisch unterschieden werden können.

2)Du hast nicht geschrieben durch was die Konten zugeordnet sein sollen. Eine Map speichert immer Paare. Mangels einer besseren Idee nehme ich jetzt mal an dass eine Zuordnung Kunde=>Konto erwünscht ist.class Kunde { ... }; //?
class Konto { ... };
class Girokonto : public Konto { ... };
class Sparkonto : public Konto { ... };

int
main()
{
...
std::map<Kunde,Konto&> konten_container;
Sparkonto& konto1 = bank.createSparkonto(kunde1);
Girokonto& konto2 = bank.createGirokonto(kunde2);

konten_container.insert(std::pair<Kunde,Konto&>(kunde1,konto1));
konten_container.insert(std::pair<Kunde,Konto&>(kunde2,konto2));

return(0);
}Ungetestet ...

Durcairion
2006-01-16, 18:20:35
Referenz oder Zeiger in der Map speicher, keine Objekte. Einfügen geht bei std::map elegant über den op[] oder map::insert mit make_pair(a,b)

Greetings

ur das ich nun genauso schlau bin wie vorher. Das man nur die Adresse wo das Objekt steht drin speichert ist mir auch klar.

Nur nicht wie das geht!

Trap
2006-01-16, 18:21:58
Referenzen in eine std::map speichern? Das wäre mir neu wenn das geht.

Am einfachsten ist es wenn man http://www.boost.org/ benutzt (ich nehm einfach mal std::string als Key und die Konten als Value)
std::map<std::string,boost::shared_pointer<Konto*> > mymap;

Sonst musst du halt immer aufpassen, dass du auch delete für die mit new erzeugten Objekte aufrufst.
std::map<std::string,Konto*> mymay;

Einfügen kann man in beiden Fällen z.B. so:
mymap["bla"]=new GiroKonto();

Durcairion
2006-01-16, 18:32:31
Nun habe ich folgende 2 Sachen gemacht:

std::map<std::string,Sparkonto*> mymap;

mymap["12"] = bank.createSparkonto(kunde1);

Nun bringt mir DevC:

cannot convert `Bank::Sparkonto' to `Bank::Sparkonto*' in assignment

Ich steh im Moment so auf dem Schlauch :/ ...

Gast
2006-01-16, 18:36:16
Referenzen in eine std::map speichern? Das wäre mir neu wenn das geht.

Tja man kan Referenzen eben wrappen... Und damit man selber keine Mühen hat nimmt man Boost (boost::ref ist es afaik / und boost::const_ref oder boost::ref_const keine ahnung da nimm ich immer intellisense). Ist auch ziemlich wichtig wenn man mit Binds und Callbacks rumspielt.

@Thread: Tja du versuchst wohl doch Objekte zu speichern. Ist wohl doch net sooooo klar, sonst würde deine Funktion einen Zeiger zurückgeben

Durcairion
2006-01-16, 19:57:16
Ok, nach einigem Hin und Her hab ichs nun fast fertig.

Nur 1 Problem habe ich noch...

Ich habe nun eine Map mit den Konten .. Schlüssel ist die Kontonummer.

Wenn ich nun alle Konten ausgeben muss und die nummern sidn 1,2,3,4,5

kann ich über

for(int i=1;i<=map.size(),i++)
{
cout << endl << maps[i]->getKontonummer() << " " << maps[i]->getSaldo() << endl;
}
die Konten ausgeben.

Wie kann ich das allerdings machen wenn die Nummern nicht in Reihe sind also z.B. 1,234,1234,9876 usw. ?

Kann man irgendwie einfach nur den "Zeiger" oder was weis ich der auf nen Feld in der Map zeigt verschieben?

Coda
2006-01-16, 20:25:06
Les mal was über Iteratoren.

Expandable
2006-01-17, 15:13:01
Wie kann ich das allerdings machen wenn die Nummern nicht in Reihe sind also z.B. 1,234,1234,9876 usw. ?

Kann man irgendwie einfach nur den "Zeiger" oder was weis ich der auf nen Feld in der Map zeigt verschieben?

Das macht man mit Iteratoren...

Beispiel:


#include <map>
#include <string>
#include <iostream>

int main()
{
std::map<std::string, int> m;
m["hallo"] = 2;
m["tschuess"] = 3;
m["holla!!"] = 4;

for (std::map<std::string, int>::const_iterator i = m.begin(); i != m.end(); ++i)
std::cout << i->first << " ->>>> " << i->second << std::endl;

return 0;
}


Ausgabe ist dann (wobei die Schlüssel automatisch sortiert werden):

hallo ->>>> 2
holla! ->>>> 4
tschuess ->>>> 3

Gast
2006-01-18, 20:43:25
Ich entführe den Thread mal wegen einer Frage zu Multimaps.


multimap <string, string> names;
names.insert(make_pair("Stefan","hoschi"));
names.insert(make_pair("Stefan","apfelschorle"));


Die Multimap soll "echte" Namen, Namen in Foren zuordnen. 'Stefan' kann also mehrere 'Forennamen' haben.

Wie sieht es nun hinsichtlich Einfügereihenfolge und Sortierung aus, wenn ich die Multimap von "vorne" bis "hinten" ausgeben möchte?
Bleibt die Einfügereihenfolge erhalten oder wird das Paar (Stefan, apfelschorle) zuerst ausgegeben?


names.insert(make_pair("Andrea","knuffi"));

Wird (Andrea, knuffi) hinter den beiden obigen Paaren, die schon in der Multimap sind, eingefügt oder wird nach "Andrea" sortiert (A vor S ;) ) ?

zeckensack
2006-01-20, 19:35:57
Ich entführe den Thread mal wegen einer Frage zu Multimaps.


multimap <string, string> names;
names.insert(make_pair("Stefan","hoschi"));
names.insert(make_pair("Stefan","apfelschorle"));


Die Multimap soll "echte" Namen, Namen in Foren zuordnen. 'Stefan' kann also mehrere 'Forennamen' haben.

Wie sieht es nun hinsichtlich Einfügereihenfolge und Sortierung aus, wenn ich die Multimap von "vorne" bis "hinten" ausgeben möchte?
Bleibt die Einfügereihenfolge erhalten oder wird das Paar (Stefan, apfelschorle) zuerst ausgegeben?IMO undefiniert, da der Schlüssel ("Stefan") gleich ist, und die Sortierung nur anhand dieses Schlüssels erfolgt. Dh je nach Compiler mal so, mal so, und du solltest dich nicht auf ein bestimmtes Verhalten verlassen.
names.insert(make_pair("Andrea","knuffi"));

Wird (Andrea, knuffi) hinter den beiden obigen Paaren, die schon in der Multimap sind, eingefügt oder wird nach "Andrea" sortiert (A vor S ;) ) ?Das wird sortiert. Prinzipiell wird immer anhand des ersten Werts des Paares sortiert, nur eben im Spezialfall dass beide Werte gleich sind, kann das nicht funktionieren.
The object orders the sequence it controls by calling a stored function object of type Pred.Pred ist im Normalfall nichts weiter als der Operator <, eingewickelt in Template-Schnack.
"Andrea" steht dann in der multimap vor den beiden "Stefan".