Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » map<string, string> soll nicht sortieren

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 < [ 2 ] [ 3 ]
000
15.10.2003, 10:37 Uhr
~Frank
Gast


Hallo.

Habe ne map<string,string> in die packe ich was rein und will es in der gleichen Reihenfolge wieder rausholen. Das Problem ist das die map automatisch nach Alphabet sortiert. Habe es wie folgt probiert klappt aber nicht:


Code:
#include <iostream>
#include <string>
#include <map>

using namespace std;

class DisableSort {
public:
  bool operator() (const string& s1, const string& s2) const {
    return false;
  }
};

int main(void) {

  map<string, string, DisableSort> test;
  test["b"] = "b";
  test["a"] = "a";

  map<string, string>::const_iterator pos;

  for (pos = test.begin(); pos != test.end(); ++pos) {
    cout << pos->first.c_str() << " " <<  pos->second.c_str() << endl;
  }

  return 1;
}




Die Ausgabe des Programms soll sein:
b b
a a

Wie kriege ich das hin ???

Gruß Frank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.10.2003, 10:48 Uhr
(un)wissender
Niveauwart


Nee, wird nicht!
Ich bekomme als ausgabe b a, dass wars.
Wo liegt das Problem?

Bitte ignorieren: ist Blödsinn
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 15.10.2003 um 10:58 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.10.2003, 10:58 Uhr
~Frank
Gast


Das Problem ist das er so dem key b die value a zuordnet, was ich ja nicht will.

Normaler weise wäre der Output (ohne DisableSort)
a a
b b

Ich will aber die Reihenfolge mit der ich die Elemente reinpacke beim rausholen auch haben also
b b
a a

Da ich b als erstes reingepackt habe.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.10.2003, 11:00 Uhr
(un)wissender
Niveauwart


Ich äußere mal eine Vermutung:
Die Objekte in einer Map müssen sortiert sein und das ist mit deiner Funktion ja nicht möglich, deshalb kommt es zu diesem fehlerhaften Ergebnis.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.10.2003, 11:05 Uhr
(un)wissender
Niveauwart


Es wird ausgegeben a b für first und second des begin()-Elements, dass ist aber in jedem Fall falsch, oder?
First oder second müssen doch in jedem Fall a a oder b b sein.
Scheint, dass die Map korrumpiert wird, oder?

virtual, sagt mal was !
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2003, 11:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Eine Map sortiert automatisch. Das ist nunmal so, denn dafür sind maps ja auch da. Dein DisableSort wird das auch nicht verhindern; es es einfach eine Inkonsistente Sortierroutine, die Du da hast; die im günstigsten Fall einfach dazuführt, daß die map zufällig sortiert; im ungünstigsten Fall dazu führen wird, daß Dein Programm abstürzt oder in einer Endlosschleife endet oder falsche Ergebnisse liefert.

Die map ist also eindeutig der falsche Container. Wenn Du näher beschreiben würdest, was du eigentlich machen willst, kann ich dir vielleicht weiterhelfen.
--
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
006
15.10.2003, 11:14 Uhr
~Frank
Gast


So was hatte ich mir schon gedacht. Man sollte eben vorher nachdenken...

Ich brauche eigentlich genau die Funktionalität einer map (key- value, keine doppelten Keys, Zugriff auf values über key). Nur eben darf sich die Reihenfolge der Elemente nicht ändern. Bin jetzt am Überlegen, ob ich vector<string,string> nehme, damit wird allerdings der Code nicht gerade schlanker, teils umständlich.
Muß dann ja immer prüfen on Element schon da usw.

Frank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.10.2003, 11:14 Uhr
RHBaum



Aehm, ueberleg mal, warum das so so sein koennte

Deine Map sortiert mittels einer einzigen funktion .... die gibst ja mit DisableSort selber an. DIe Less funktion, gibt an, ob das element kleiner ist ...

Nun muss es die elemente einfuegen, dazu vergleicht es das was in der map schon drinsteht (t1) mit dem was in die map eingefuegt(t2) werden soll.

t1 < t2 -> ja ...
t2 < t1 -> nein ...
t2 kommt weiter hinter ...

t1 < t2 -> nein ...
t2 < t1 -> ja ...
t2 kommt vor t1 !


nun undefiniert !!!
t1 < t2 -> nein ...
t2 < t1 -> nein ...
oder
t1 < t2 -> ja ...
t2 < t1 -> ja ...

Eigentlich sind die elemente GLeich ... also t2 ueberschreibt t1 ...

auf welches muster deine Map nun reagiert, ist glaub ich implementationssache ...
versuch mal, deinen DisableSort Funktor auf konstant true zu setzen ....

Prinzipiell ists aber schlechtes design, weil du von der Implementierung abhaengig bist ....

Was du willst ist, die eigenschaften 2er Container gleichzeitig nutzen ...
zugriff uber ELemente (map) sequentielle Speicherung mit iteration drauf (list)
Dann nutz auch beide !
Schreib dir ne Klasse die als member ne map und ne List hat ... die Map befuellst traditionell ... die List mit Zeiger auf die elemente ... Bau dir nen iterator zu, der nen normalen stl iterator nachbildet ... damit es von aussen verwenden kannst.
Ist dir das zu viel aufwand (weil es eh nur einmal brauchst oder so) ... dann aender dein prinzipielles Design ...

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.10.2003, 11:32 Uhr
virtual
Sexiest Bit alive
(Operator)


Gnz klar ist es mir nicht. Stellen wir uns mal einen Container vor, der das kann, was du willst. Nennen wir ihn einfach Cont



C++:
Cont<std::string, std::string> c;

c["a"] = "Ah";
c["b"] = "Be";
c["c"] = "Ce";
...
c["a"] = "Ah";

// Ausgabe c.begin() - c.end()
...


Was soll passieren (zutreffendes Ankreuzen )?
[ ] Die ausgabe soll sein: "Ah, Be, Ce"
[ ] Die Ausgabe soll sein: "Be, Ce, Ah"
[ ] Das zweite c["a"] soll eine Exception werfen
--
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
009
15.10.2003, 11:41 Uhr
(un)wissender
Niveauwart


Also, wenn ich das richtig verstanden habe, befindet sich die Map in einem undefinierten Verhalten, weil e1 < e2= false und e2 < e1= false.

Das hatte ich auch schon vermutet, aber die Map könnte ja clever sein und sagen, hey, wenn keiner kleiner ist, dann sind sie wohl gleich, und ich degeneriere meinen Baum zu einer linaren Liste!

Aber das ist wohl vom Standard nicht vorgesehen, weil dann die logarithmische Suchkomplexität nicht eingehalten wird, sondern linear ist.
Richtig?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: