Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Schlüssel-Schlüssel Beziehung

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
01.09.2004, 13:18 Uhr
~Dirk
Gast


Hi,

mit der Map der STL kann ich eine Schlüssel - Wert Beziehung realisieren. Mittels des Schlüssels kann ich auf den Wert zugreifen. Dies klappt auch gut.
Was aber mache ich, wenn ich eine Schlüssel - Schlüssel Beziehung realisieren möchte, d.h. der Wert auf der linken Seite ist eindeutig einem Wert auf der rechten Seite zugeordnet und der Wert auf der rechten Seite ist eindeutig einem Wert auf der linken Seite zugeordnet.

z.B.

a,1
b,2
c,3
d,4

Wie kann ich jetzt eine Suche in beiden Richtungen realisieren. Bislang habe ich 2 Maps verwendet. Eine Map wo der key die Buchstaben repräsentiert und der Value durch die Zahlen. Und eine wo der key die Zahlen und der Value die Buchstaben repräsentiert.

Vielen Dank schonmal

Dirk

P.S.:
Es handelt sich oben nur um ein banales Beispiel. Mir geht es einfach darum, wie man es am besten schafft in beide Richtungen zu suchen, wenn eine Schlüssel - Schlüssel Beziehung vorliegt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.09.2004, 21:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn es eine deindeutige Beziehung zwischen den beiden Schlüsseln gibt bedeutet das doch, daß man aus dem einen Schlüssel den anderen ableiten kann. Wenn es Dir generell darum geht, in einer Map über zwei verschiedene Arten zu indizieren, solltest Du dir überlegen, ob es vielleicht sinnvoll ist, eine KeyKlasse zu entwerfen, die beide Schlüsseltypen aufnehmen kann.
Letztelich hängt das aber alles vom Anwendungsfall ab.
--
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
002
01.09.2004, 21:41 Uhr
Dirk



Hi,

naja, ich habe Daten aus einem ini-File ausgelesen. Dies war immer so aufgebaut, dass ein String einer ID zugeordnet war. Jeder String war eindeutig und jede ID war eindeutig. Jetzt habe ich mich gefragt, in was für einen Container ich es am geschicktesten einlese, damit ich zu einem späteren Zeitpunkt, wenn ich nur die ID habe den dazugehörigen String kriege. Und wenn ich den String habe, ich dann die dazugehörige ID bekomme. Es hat mich einfach mal interessiert. Die Lösung mit den 2 Maps tut zwar, ich finde sie allerdings nicht schön.
Kannst du bitte mal ein Beispiel mit ein paar Zeilen Code erstellen, wie das mit der Keyklasse funktionieren soll.
Wie würdest du es am geschicktesten realisieren, wenn man in meiner Beispieltabelle, die prinzipiell die Daten meines ini-Files darstellt, in beiden Richtungen suchen können soll.
wenn man beispielsweise c auswählt, soll 3 herauskommen. Wenn man 3 auswählt, dann soll c herauskommen. Wenn man 4 auswählt, dann soll d herauskommen, ...

Vielen Dank schonmal für deine Antwort

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.09.2004, 21:55 Uhr
~Dirk
Gast


Hi,

was prinzipiell auch gehen würde, wäre es 2 Listen zu nehmen. In der einen Liste die Strings und in der anderen Liste die IDs zu speichern. Wenn man einen String hat, sucht man in der Liste mit den Strings den String heraus und kennt somit seinen Index. Über diesen Index kann man in der anderen Liste die dazugehörige ID herausfinden. Das ganze geht natürlich auch umgekehrt.
Allerdings habe ich dann keine kompakte Datenstruktur, sondern zwei einzelne Listen. Wäre dies effektiv?
Naja, ich bin mal gespannt darauf, wie du dieses Problem am geschickteste lösen würdest.

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.09.2004, 10:48 Uhr
RHBaum



Willst du nach unterschiedlichen Kriterien suchen, wirst du unterschiedliche Container brauchen ....

In der Map kannst nun mal effektiv nur nach den Key suchen, aber genau dafuer ist sie ja da ! Nach den zugeordneten wert tut man sich halt schwerer :-)

3. möglichkeiten:
- du vermeidest die suche nach den Strings, was dir auch performance technisch viele vorteile bringt :-) Wird man aber ned immer realisieren koennen ...

- du laesst die suche nach dem String langsam wie sie ist, und verwendest nur eine Map. String vergleiche sind eh langsam, naja, mit nem sehr langsamen Suchalgorythmus potentiert sich dass dann ein bisserl. Aber man muss Prioritaeten haben ! :-) (suchst du wirklich so oft nach dem String ??? )

- deinen schon verwendeten Loesungsansatz perfektionieren ! 2 feste Maps fuer die hin und ruecksuche klingen gar ned mal so verkehrt. Fuer ne detailierter Loesung kenn ich die Aufgabenstellung noch zu wenig.
Aber denkbar waer auch ne Loesung mit 3 containern .... warum ? um die Strings ned kopieren zu muessen (performance)
Die liste brauchst um deine Strings zu halten ....

ne einfache Liste mit nem Pair <interger, String>
1 Map mit <integer,const Zeiger auf den C-String im Pair> (also c_str() funktion nutzen)
1 Map mit <const Zeiger auf CString im Pair, integer> zum sortieren der C-Strings ne C-Funktion (gekapselt) verwenden (String-Klasse ist ja kein member deiner Map).

Die ganze Sache schoen in eine eigene Klasse verpacken und als Container verkaufen . Ist dann auch ne saubere / runde Sache !

Fuer nen Project hab ich mal ne dynamische Sortierung schreiben muessen. da hab ichs so "aehnlich" gemacht.
Fuer jede vordefinierte Sortierung gabs nen eigenes vordefinierte std::set.
fuer selbstdefinierte wars etwas kniffliger. du kannst zwar die Sortiermethode "dynamisch" gestalten, in dem du deren parameter ueber variablen steuerst, aber die Maps/Sets lassen sich ned "umsortieren". Also muss man die Sets eben auch dynamisch erzeugen .... solange da nur veweise umherschiebst, geht das auch recht flott.

Ciao ...
 
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: