 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Volz Guest
|
Posted: Sun Oct 30, 2005 12:29 pm Post subject: Datenstruktur für Tabellen mit Index? |
|
|
Hi,
ich habe ein Datenstruktur die praktisch in Tabellenform vorliegt. Ich
muss darauf auch über mehrere Spalten zugreifen. Wenn ich eine Struktur
aus maps und vectoren aufbauen, dann endet das in einer Zugriffrichtung
immer in sehr vielen Schleifendurchläufen bis der Wert gefunden ist.
Ich habe im Durchschnitt für jede Zugriffsspalte etwa gleich viele
Zugriffe.
Eigentlich bräuchte ich so eine Datenorganisation wie ich auf eine
SQL-Datenbank zugreife, nur eben im Speicher. Eine Datenbank scheint
mir aufgrund der Datengröße übertrieben zu sein. Ich muss ja die Daten
auch nicht auf einer Platte abspeichern. Die Tabelle muss nur zur
Laufzeit aufgebaut und im Speicher gehalten werden.
Welche Ansätze gibt es um Tabellen mit Indexzugriff auf mehreren
Spalten in C++ zu organisieren?
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Raymond Haeb Guest
|
Posted: Sun Oct 30, 2005 12:42 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
Es begab sich, daß Andreas Volz der Welt verkündete:
| Quote: | Welche Ansätze gibt es um Tabellen mit Indexzugriff auf mehreren
Spalten in C++ zu organisieren?
|
Wie wäre es mit boost multiindex?
http://www.boost.org/libs/multi_index/doc/index.html
Raymond
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
M G Berberich Guest
|
Posted: Sun Oct 30, 2005 12:52 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
On Sun, 30 Oct 2005, Andreas Volz <usenet-spam-trap (AT) brachttal (DOT) net> wrote:
| Quote: | ich habe ein Datenstruktur die praktisch in Tabellenform vorliegt. Ich
muss darauf auch über mehrere Spalten zugreifen. Wenn ich eine Struktur
aus maps und vectoren aufbauen, dann endet das in einer Zugriffrichtung
immer in sehr vielen Schleifendurchläufen bis der Wert gefunden ist.
Ich habe im Durchschnitt für jede Zugriffsspalte etwa gleich viele
Zugriffe.
Welche Ansätze gibt es um Tabellen mit Indexzugriff auf mehreren
Spalten in C++ zu organisieren?
|
Wie Du schon ganz richtig festgestellt hast: map (und multimap). Bau
Dir eine map mit Zeigern auf die Daten, das nennt man bei DBs dann
Index. Das machst Du für jeden Zugriff den Du indiziert haben willst.
MfG
bmg
--
"Des is völlig wurscht, was heut beschlos- | M G Berberich
sen wird: I bin sowieso dagegn!" | [email]berberic (AT) fmi (DOT) uni-passau.de[/email]
(SPD-Stadtrat Kurt Schindler; Regensburg) | www.fmi.uni-passau.de/~berberic
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Florian Weimer Guest
|
Posted: Sun Oct 30, 2005 2:20 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
* Andreas Volz:
| Quote: | Eigentlich bräuchte ich so eine Datenorganisation wie ich auf eine
SQL-Datenbank zugreife, nur eben im Speicher. Eine Datenbank scheint
mir aufgrund der Datengröße übertrieben zu sein.
|
Der Einsatz von SQLite bietet sich trotzdem an.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Sun Oct 30, 2005 2:51 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
Am Sun, 30 Oct 2005 13:52:12 +0100 schrieb M G Berberich:
| Quote: | On Sun, 30 Oct 2005, Andreas Volz <usenet-spam-trap (AT) brachttal (DOT) net
wrote:
ich habe ein Datenstruktur die praktisch in Tabellenform vorliegt.
Ich muss darauf auch über mehrere Spalten zugreifen. Wenn ich eine
Struktur aus maps und vectoren aufbauen, dann endet das in einer
Zugriffrichtung immer in sehr vielen Schleifendurchläufen bis der
Wert gefunden ist. Ich habe im Durchschnitt für jede Zugriffsspalte
etwa gleich viele Zugriffe.
Welche Ansätze gibt es um Tabellen mit Indexzugriff auf mehreren
Spalten in C++ zu organisieren?
Wie Du schon ganz richtig festgestellt hast: map (und multimap). Bau
Dir eine map mit Zeigern auf die Daten, das nennt man bei DBs dann
Index. Das machst Du für jeden Zugriff den Du indiziert haben willst.
|
Ja, mit maps (multimaps) hab ich auch vermutet. Aber ich bin noch nicht
ganz sicher wie genau. Ich zeige mal meine Datenstruktur:
Target | Mass | Negative | Positive | Zero
----------------------------------------------
string | string | float | float | float
....
Jetzt ist eine Target/Maß Kombination zusammen ein eindeutiger
Schlüssel. Somit können also Werte in Target oder Mass einzeln
betrachtet mehrmals vorkommen.
Ich will in SQL-Schreibweise also hauptsächlich folgende Aufrufe
durchführen:
SELECT Mass, Negative, Positive, Zero from tabelle WHERE Target='xxx'
oder
SELECT Target, Negative, Positive, Zero from tabelle WHERE Mass='xxx'
oder
SELECT Negative,Positive,Zero from tabelle WHERE Mass='xxx'
AND Target='yyy'
Nur damit ohne viel Worte klar wird was ich erreichen will.
Ich stelle mir das momentan so vor:
struct Data
{
string target;
string mass;
float negative;
float positive;
float zero;
};
multimap
multimap <string, Data*> mass_map; // string=mass
Damit müsste es funktionieren. Dann noch eine Klasse daherum gebaut um
sicherzustellen, dass die "Datenbank" konsistent bleibt (z.B.
eindeutige Schlüssel). Momentan ist nur einmaliges Einfügen und
ständiges Auslesen vorgesehen. Aber falls sich das mal ändert würde es
mit dem Anlegen der Schlüssel etwas komplizierter. Kann man das so
machen? Oder wäre ein anderes Vorgehen besser?
Zusatzfrage:
Kennt jemand eine fertige C++ Klasse oder Bibliothek die eine
relationale Datenbank als Datenstruktur realisiert? (Mit SQL-Abfrage?)
Aber ohne Festplattenzugriff (z.B. MySQL oder so). Nur für Operationen
im Speicher.
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Sun Oct 30, 2005 3:17 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
Am 30 Oct 2005 14:42:47 +0200 schrieb Raymond Haeb:
Das sieht sehr gut aus! Ich teste gerade mal die Beispiele aus ob ich
es damit hinbekomme. Ich hab boost installiert, aber kann ich dann
später beim weitergeben meines Programms auch nur die eine Klasse aus
Boost rauskopieren? Mir erscheint Boost ansonsten als zu große
Abhängigkeit.
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Sun Oct 30, 2005 3:36 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
Am Sun, 30 Oct 2005 15:20:56 +0100 schrieb Florian Weimer:
| Quote: | * Andreas Volz:
Eigentlich bräuchte ich so eine Datenorganisation wie ich auf eine
SQL-Datenbank zugreife, nur eben im Speicher. Eine Datenbank scheint
mir aufgrund der Datengröße übertrieben zu sein.
Der Einsatz von SQLite bietet sich trotzdem an.
|
Ja, das kenne ich auch vom hören. Ich bin auch am überlegen ob ich das
nutze. Der Vorteil ist halt die einfache Benutzung und das ich SQL im
Gegensatz zu dem Boost-Template schon kann. Ich versuch es mal mit
Boost und wenn das nicht auf Anhieb will, ist SQLite mein nächster
Versuch.
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Mon Oct 31, 2005 1:53 pm Post subject: Re: Datenstruktur für Tabellen mit Index? |
|
|
Am 30 Oct 2005 14:42:47 +0200 schrieb Raymond Haeb:
Boost multi_index scheint zu passen. Mein Beispielprogramm funktioniert
schon fast wie ich es gern hätte. Allerdings noch nicht ganz, es geht
immer nur nach einem Index suchen. Und zwar nach dem ersten den ich
einfüge:
typedef multi_index_container<
learnedMeasure,
indexed_by<
ordered_unique<
composite_key<
learnedMeasure,
member
member<learnedMeasure,std::string,&learnedMeasure::measure_name>
| Quote: |
learnedMeasureSet;
.... |
// look for all blub2.target
std::pair<learnedMeasureSet::iterator,learnedMeasureSet::iterator> p=
es.equal_range(boost::make_tuple (std::string("blub2.target")));
cout << "search:" << endl << endl;
while(p.first!=p.second){
std::cout<
<
++p.first;
}
Wenn ich allerdings nach einem Feld aus measure_name suche, dann wird
nichts gefunden. Wenn ich die Reihenfolge beim Anlegen der Index in
learnedMeasureSet vertausche, dann wird es gefunden. Der Befehl sucht
also immer nach dem ersten Index.
Dazu auch das Zitat aus der Boost Doku:
"...partial searches without specifying the first keys are not allowed."
Ich hab schon die Boost List aboniert, aber warte schon seit Gestern
darauf das meine E-Mail durch kommt. Daher hoffe ich das mir jemand
hier helfen kann.
Gibt es wirklich keine Möglichkeit nach den Indexen unabhängig zu
suchen? Für meine Anwendung ist es wichtig in dem Datenbestand nach
zwei Indexen unanhängig von einander zu suchen. Sonst müsste ich es
doch mit dem SQL-Hammer oder über doppelt verwaltete Datenbestände
lösen. Wäre schade, ansonsten gefällt mir boost multi_index sehr gut.
Gruß
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|