On Monday 20 October 2003 17:42, Bastian Schern wrote:
Jedes Bit in dem File repräsentiert eine Randomzahl. Beispiel: Ich benötige z.B. 2 Zahlen zwischen 0 und 7, dann erhalte vielleicht 2 und 5. Dazu setze ich jetzt einfach Bit 2 und 5 in meinem Bitset auf true und erhalte somit 001001000. Man könnte sich jetzt natürlich auch einfach 2 und 5 in einem vector<int> merken, dafür benötige ich dann aber schon 2*4 Byte Platz. In der Praxis werden es wahrscheinlich 100*10^6 Zufallszahlen sein. Also ca. 100MB im Bitset bzw. 3,2GB im Vector. Das macht dann schon einen erheblichen Unterschied. Ein Bitweises Seeken ist nicht nötig. Es wird höchstens am Ende schwierig, wenn 1 bis 7 Bytes übrig sind. Da ich mir allerdings noch ca. 1000 dieser Files anlegen möchte kann ich nicht mal die 100 MB im Speicher halten. Ich habe mir dann gedacht, dass ich dann immer jeweils nur 1000 Byte aus einem Bitset im Speicher behalte und die Bitsetfiles dann sequentiell in 1000 Byte-Schritten abarbeite.
Na gut, das ist dann natürlich schon eine sehr spezielle Anwendung; dafür ist
die Standard-Serialisierung ( operator<<( bool ) ) wohl wirklich denkbar
ungeeignet - und dafür ist sie wohl auch nicht gedacht.
Dafür würde ich mir dann wirklich eine spezielle Funktion gönnen, die diese
Bits gepackt wegschreibt.
Ich bin mir aber ziemlich sicher, daß <bitset> genau das kann - und für Deine
Anwendung auch viel geeigneter ist, weil auch im Speicher jedes Bit nur ein
Bit und nicht wie bei vector<bool> ein Byte braucht. auch operator<<() ist
dort hoffentlich effizienter implementiert.
"bool" ist für einzelne Flags gedacht, nicht für große Mengen; genau dafür
gibt es <bitset>. Mehr Info hier:
http://cplus.about.com/library/weekly/aa042203j.htm
http://www.josuttis.com/libbook/cont/bitset1.cpp.h
CU
--
Stefan Hundhammer