Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit <map>

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.08.2005, 23:54 Uhr
~Nico26
Gast


Hi!

Ich hab ein Problem mit einer C++-map. Ich habe eine map<unsigned, myClass>, die als Schlüssel ein unsigned verwendet und als Wert eine von mir definierte Klasse.

Die unsigned-Werte, die ich als Schlüssel verwende, sind Datum-Werte, z.B. 20050814. Ich lese viele Werte in die map ein (ca. 1400) und das Problem ist, dass die map sich anscheinend irgendwann (ich glaub mal gelesen zu haben, wenn sie eine anfangs definierte Größe überschreitet) resizet wird und dadurch aber meine Datums-Werte durcheinanderkommen.

D.h. obwohl ich die Werte mit aufsteigendem Datum einfüge, z.B. vom 1.1.2001 (20010101) bis zum 14.8.2005 (20050814), liegen sie nach dem Füllen der map nicht mehr in dieser Reihenfolge vor, sondern etwa so 20020712 bis 20050814, dann 20010101 bis 20020711.

Mir sind 2 Dinge eingefallen, was ich tun könnte, ich weiß jedoch nicht wie es geht:

1. die Map nach dem Füllen mit Daten sortieren, sort(mapName.begin(), mapName.end()) bringt mir 9 Fehler (evtl. weil ich myClass in der map verwende??)
2. die Größe der map bereits vor dem Füllen festlegen, sodass kein Resize auftritt.

Wär super, wenn mir jemand sagen könnte, wie eines der beiden Dinge funktioniert.

Danke & Gruß,
Nico.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.08.2005, 00:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich hab mit map noch nicht gearbeitet aber mal was dazu gelesen...
Also normalerweise fügt der gleich richtig sortiert ein. Das sollte imho auch das "resizen" berücksichtigen. Du kannst beim Konstruktor der map das Sortierkreterium auch expliziet mit angeben. Selber sortieren ist eigentlich ziemlich sinnlos da die map ja sortiert...


C++:
map<int,string,SortFtor> mySortMap;



resize vermute ich mal stark wird nicht gehen, da müsste es dann ja default argumente geben und die wirst du ja spontan auch nicht so schnell wieder los da du ja gar nicht weisst unter welchem schlüssel die erstellt wurden...

insgesammt scheint es mir auch fraglich ob du überhaupt direkt die objekte deiner map übergeben kannst oder ob du nicht einen pointer nehmen müsstest und die objekte mit new zu allokieren... (wenn ein objekt immer die gleiche grösse hat müsste es funzen aber an sonsten von hand allokieren...)
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 16.08.2005 um 00:32 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.08.2005, 08:45 Uhr
RHBaum




Zitat:

2. die Größe der map bereits vor dem Füllen festlegen, sodass kein Resize auftritt.


Entweder verwendest du ne komische map, oder du verwechselst das mit nem vector :-)

Bei der Map werden die Keys in nem Baum untergebracht, also in ne sehr wohl vorsortierte Form :-)
Deinen speicher neu anfordern, weil Werte hinzukommen iss da dein geringstes Problem :-)
Es wuerde also null bringen, das mit ner Vordefinierten groesse wegzuoptimieren, weil die zeit verheizt du beim einfuegen an ganz anderen stellen :-)

Deine werte werden per referenz irgendwo im Allokator abgelegt, die sind nich aufeinanderfolgend, also brauchst kein resize, sondern bei jedem element macht die map eh sowas wie nen new ....

Nen resize iss wirklich nur bei nem vector relevant ....


Zitat:

Die unsigned-Werte, die ich als Schlüssel verwende, sind Datum-Werte, z.B. 20050814.


Es gibt auch unter C++ definierte typen fuer zeit und datum ... als simple typen ...
Um spaeter mit darstellung usw nich in die Sackgasse zu geraten, solltest besser die verwenden ... die sind auch so aufgebaut, dass der lesser operator logisch richtig funktioniert ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.08.2005, 08:59 Uhr
virtual
Sexiest Bit alive
(Operator)


[quote RHBaum]
Zitat:

Nen resize iss wirklich nur bei nem vector relevant ....


Um es deutlicher auszudrücken: ein resize gibt es bei einer map garnicht!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.08.2005, 13:00 Uhr
(un)wissender
Niveauwart



Zitat von RHBaum:

Bei der Map werden die Keys in nem Baum untergebracht, also in ne sehr wohl vorsortierte Form :-)



Um es deutlicher auszudrücken: eine std::map ist immer sortiert.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.08.2005, 17:48 Uhr
~Nico26
Gast


OK, hab den Fehler gefunden und nun läuft alles wie geschmiert! Bei genauerem Hinsehen hab ich festgestellt, dass ich keine map<unsigned, myClass> hatte, sondern eine map<short, myClass>. Da meine Datums als unsigned in der Größenordnung von 20040814 gespeichert sind, war das short damit überfordert und er kam irgendwie durcheinander.

Aber wie gesagt, nun funktioniert's wie es soll.

Danke an alle!
Gruß, Nico.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: