Map/List/... mit key=value füllen?

Alles rund um die Programmierung mit Qt
Antworten
arne.anka
Beiträge: 32
Registriert: 28. Dezember 2005 14:06

Map/List/... mit key=value füllen?

Beitrag von arne.anka »

hej,
gibt es einen datentyp (QMap, QList oder was auch immer) in Qt, dem ich daten etwa so übergeben kann

Code: Alles auswählen

meinTyp.set("key=value");
und auf die daten dann mit sowas wie

Code: Alles auswählen

meinTyp.get("key");
zugreifen kann?
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

hi,
wie wäre es wenn du einfach eine von QMap erbende Klasse machst?

Wenn es nichts ausmacht, dass weder Key noch Value ein = enthalten dürfen könnte das hier in etwa gehen (ungetestet):

Code: Alles auswählen

/////////////////////////////////////////
// HEADER

# include <QMap>
# include <QString>

typedef QMap < QString, QString > QStringMap;

class C_FunnyStringMap : public QStringMap
{
public:
   C_FunnyStringMap ( );
   C_FunnyStringMap ( const QStringMap &f_other );
   const QString C_FunnyStringMap:value ( const QString &f_key, const QString &f_std = QString ( ) ) const;
   bool C_FunnyStringMap:set ( const QString &f_set );
};

/////////////////////////////////////////
// Source

# include <QStringList>

C_FunnyStringMap::C_FunnyStringMap ( )
{
}

C_FunnyStringMap::C_FunnyStringMap ( const QStringMap &f_other )
/* <-- */ : QStringMap ( f_other )
{
}

const QString C_FunnyStringMap:value ( const QString &f_key, const QString &f_std ) const
{
  return QStringMap::value ( f_key, f_standard );
}

bool C_FunnyStringMap:set ( const QString &f_set )
{
   QStringList list ( f_set.split ( "=", QString::SkipEmptyParts ) );

   if ( list.size ( ) < 2 )
      return false;

   QStringMap::iterator it ( QStringMap::find ( list [ 0 ] );

   if ( it != QStringMap::end ( ) )
      ( *it ) = list [ 1 ];
  else
      QStringMap::insert ( list [ 0 ], list [ 1 ] );

   return true;
}
Ich hoffe das hilft weiter...

Elgrimm Esleborn
Glaube an eine Lösung, nur dann kannst du auch eine finden.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QHash

Zwar nicht ganz so wie Du möchtest, aber imho recht nah dran.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

naja QMap und QHash haben was das betrifft kaum Unterschiede...

das Beispiel ist halt ein QHash < QString, T > bzw ein QMap < QString, T >
Glaube an eine Lösung, nur dann kannst du auch eine finden.
arne.anka
Beiträge: 32
Registriert: 28. Dezember 2005 14:06

Beitrag von arne.anka »

danke an alle.
mir ging es schon um set("key=value").
ich bin dabei, ein cgi zu schreiben und bekomme vom server via

Code: Alles auswählen

getenv("HTTP_COOKIE")
ja einen string der form

Code: Alles auswählen

key=value;key=value;key=value
wenn ich den am ; splitte, habe ich eine stringlist -- und die hätte ich halt gerne schnell und zeitsparend in so eine struktur gesteckt.
da das aber offenbar nicht geht, muss ich eben doch über die stringlist iterieren und jedes item am = splitten ...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

arne.anka hat geschrieben: wenn ich den am ; splitte, habe ich eine stringlist -- und die hätte ich halt gerne schnell und zeitsparend in so eine struktur gesteckt.
da das aber offenbar nicht geht, muss ich eben doch über die stringlist iterieren und jedes item am = splitten ...
Nunja, einfach eine kleine Wrapper-Funktion die das für dich erledigt und schon kann es Dir auch egal sein.

Oder Du leitest deine Klasse von QHash ab und überlädst iterator QHash::insert ( const Key & key, const T & value ). Da es aber ein Template ist, muss man sehr aufpassen... da ist eine kleine Helper-funktion doch einfacher ;-)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
arne.anka
Beiträge: 32
Registriert: 28. Dezember 2005 14:06

Beitrag von arne.anka »

schon klar -- wollte mich nur vorher erkundigt haben, bevor ich das rad nochmal erfinde.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Oder du machst einfach noch ein Split.

Code: Alles auswählen

QMap<QString, QString> pairs;
QStringList cookieText = QString( "key=value;key=value;key=value" ).split( ";" );
for( int i = 0; i < cookieText.size(); i++ )
        pairs[cookieText[i].split( "=" )[0]] = cookieText[i].split( "=" )[1];
Finde ich persönlich schöner und kompakter. Unter Umständen ist diese Lösung schneller, da kein Wrapper verwendet wird. Praktisch ist es aber vielleicht egal, weil der Compiler den Wrapper optimiert hätte.


SG Alexander
arne.anka
Beiträge: 32
Registriert: 28. Dezember 2005 14:06

Beitrag von arne.anka »

das ist auch meine lösung -- nur dass ich eben von irgendwoher im hinterkopf habe, dass diese splitterei recht aufwendig sei.
keihne ahnung, ob das (noch/für qt) stimmt.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Wenn, dann ist aufwändig in dem Fall relativ. In einer Applikation werden in einer Schleife, die 12 000 mal durchläuft pro Durchlauf 3 Split's verwendet und das läuft in Echtzeit auf einem Sempron 2800+. Das ganze ist in Qt4 geschrieben. Also dürfe nicht so kritisch sein.
Antworten