Kleiner Datentyp gesucht bzw. programmieren



  • 1mio Elemente haut man auch auf den Heap und nicht auf den Stack!

    naja, und ob man 1MB oder 500KB grosse Dateien hat, ist schon fast egal...

    wenn du wirklich mit einzelnen bits arbeiten wuerdest, waere das doch recht lahm, und ich denke nicht, dass es das wert ist, oder?



  • was hälst du davon mehrere Werte in einer Struct zu speichern

    struct Struktur {
       char a : 2;
       char b : 2;
       char c : 2;
       char d : 2;
    };
    


  • Nur mal eine Frage, aber bevor ich zwei bools nehme die insgesamt 4 Schaltzustände repräsentieren können und 2Bytes benötigen nehm ich lieber einen char der 1Byte benötigt und 256 verschiedene Schaltzustände besitzt und damit auch noch erweiterbar ist 😕.

    MfG SideWinder



  • class EnumFeld
    {
       vector<bool> data;
    ...
       int operator[](size_t index)
       {
          return 2*data[i]+data[i+1];
       }
    

    Aber 1MB ist doch nicht viel. Nimm einfach vector<char>, der legt mit new an und dan haste kein Stackproblem.

    [ Dieser Beitrag wurde am 26.06.2002 um 18:34 Uhr von volkard editiert. ]



  • du kanns ja ein bool array benutzen beim arbeiten und beim speichern reduzierst du alles auf pro bool auf 1 bit, beim speichern bremst sowieso die hdd aus die paar bit operatioen stören dan nicht wirklich



  • wieso haben eingentlich einige die seltsame Idee bool belege nur 1Bit. Es gibt wohl kaum eine Plattform, die das so macht. Wahrscheinlicher ist mindestens ein Byte, wenn nicht ein Wort.



  • Original erstellt von Helium:
    wieso haben eingentlich einige die seltsame Idee bool belege nur 1Bit. Es gibt wohl kaum eine Plattform, die das so macht. Wahrscheinlicher ist mindestens ein Byte, wenn nicht ein Wort.

    Es geht nicht um bool, der kann kaum kleiner als 1 byte sein, um noch adressierbar zu sein.
    Wir reden von vector<bool>.
    Das Fehlerchen ganz am Anfang dieses Threads ist verzeihbar.

    [ Dieser Beitrag wurde am 26.06.2002 um 19:02 Uhr von volkard editiert. ]



  • danke für die vielen anregungen aber mir ist gerade die Idee gekommen
    da es mir hauptsächlich um den Plattenspeicher geht könnte ich das doch alles zippen, ich hab mir schon ein paar Scripts zum Huffmann Code gezogen.



  • Original erstellt von Real_PsychoDAD:
    danke für die vielen anregungen aber mir ist gerade die Idee gekommen
    da es mir hauptsächlich um den Plattenspeicher geht könnte ich das doch alles zippen, ich hab mir schon ein paar Scripts zum Huffmann Code gezogen.

    ich würde trozdem die bool in bits abbilden wenn du es abspeicherst



  • @volkard: Sollte man einen vector<bool> nicht eigentlich nicht verwenden um Platz für viele boolesche Werte zu machen? Da gibts doch so eine ungeeignete (bzw. nicht ungeeignet aber für andere Einsatzfälle gedachte) Implementierung, oder?

    Ich bin weiterhin für std::vector<char> ... das kommt immer noch am besten und die ganze Sache ist leicht erweiterbar.

    MfG SideWinder



  • Original erstellt von SideWinder:
    @volkard: Sollte man einen vector<bool> nicht eigentlich nicht verwenden um Platz für viele boolesche Werte zu machen? Da gibts doch so eine ungeeignete (bzw. nicht ungeeignet aber für andere Einsatzfälle gedachte) Implementierung, oder?

    Hab die Frage nicht verstanden.
    vector<bool> war doch das Ding, das Bitgepackt die Daten hält. Deswegen hat mein Code da oben nen Verbrauch von 2 Bits pro Wert.
    Ich würde auch vector<char> bevorzugen.



  • Ja, das stimmt schon. Aber HumeSikkins hat mir einmal erklärt, dass man std::vector<bool> nicht verwenden soll um einen Vektor von boolschen Werten zu erstellen.

    MfG SideWinder



  • Original erstellt von SideWinder:
    **Ja, das stimmt schon. Aber HumeSikkins hat mir einmal erklärt, dass man std::vector<bool> nicht verwenden soll um einen Vektor von boolschen Werten zu erstellen.
    **

    Jo, da stimm ich gerne zu. So allgemein.



  • @Dimah
    Wie bildet man die bools den bitweise beim speichern ab,
    also mit Strukturen und Bitfeldern bekomme ich es nicht hin 😞

    Nun wollte ich noch einen std::vector mehrdimensional machen nur irgendwie akzeptiert mein Compiler folgende Form nicht
    std::vector<std::vector<char>> c;
    sieht doch eigentlich korrekt aus ?

    : error C2146: Syntaxfehler : Fehlendes ',' vor Bezeichner 'c'
    k:\vc6_projekte\mecharena\neu\01\map.h(58) : error C2065: 'c' : nichtdeklarierter Bezeichner
    k:\vc6_projekte\mecharena\neu\01\map.h(58) : error C2143: Syntaxfehler : Fehlendes '>' vor ';'
    k:\vc6_projekte\mecharena\neu\01\map.h(58) : error C2208: 'class std::vector' : Keine Elemente definiert, die diesen Typ verwenden



  • Original erstellt von Real_PsychoDAD:
    **
    std::vector<std::vector<char>> c;
    **

    [/QUOTE]

    Tja, da bist du auf einen "peinlichen Designfehler" gestossen.
    Loesung:
    std::vector<std::vector<char> > c;



  • Ja, das stimmt schon. Aber HumeSikkins hat mir einmal erklärt, dass man std::vector<bool> nicht verwenden soll um einen Vektor von boolschen Werten zu erstellen.

    Ich schätze mal, dass ich eher sowas gesagt habe 😉

    Bevor man einen vector<bool> verwendet, sollte man sich genau anschauen, was das eigentlich ist. Dann sollte man sich darüber im Klaren sein, dass diese Spezialisierung nicht die Anforderungen an einen STL-Container erfüllt, das dieser Container keine bools speichert und das einem hier außerdem eine bestimmte Optimierung auf's Auge gedrückt wird.

    Nur wenn man das alles weiß und wenn man sich sicher ist, dass ein vector<bool> genau das ist, was man braucht, dann sollte man ihn verwenden. Allerdings sollte man vorher nocheinmal prüfen, ob ein std::bitset nicht auch gehen würde.

    Im Allgemeinen Fall aber sollte man statt der Spezialisierung vector<bool> lieber einen vector<char> oder einen deque<bool> verwenden.



  • Original erstellt von Real_PsychoDAD:
    **Nun wollte ich noch einen std::vector mehrdimensional machen nur irgendwie akzeptiert mein Compiler folgende Form nicht
    std::vector<std::vector<char>> c;
    sieht doch eigentlich korrekt aus ?
    **

    std::vector<std::vector<char> > c; //das leerzeichen ist wichtig
    

    um bools auf bit ebene zu speichern gibts mehrer wege, ein leichter ist vector<bool>, obwohl ein bool i.d.r. 1 byte gross ist speichert vector<bool> ein bool pro bit das kann es nur da durch das es in wirklich keit keine richtigen bools speichert es macht ehr ein paar rechen operationen, man spart zwar speicher aber es wird langsammer,

    bitset<32> und die funkion to_ulong() sind deine freunde

    e: ups diesam mal war ich aber ziemlich langsamm

    [ Dieser Beitrag wurde am 26.06.2002 um 23:35 Uhr von Dimah editiert. ]



  • hm na da hat er doch wohl Recht 🙂
    und bei nur 4zustaenden duerft sich da ja recht ordentl kompremieren lassen, oder?



  • Gemeine Falle mit dem mehrdimensionalen std::vector 🙂
    Gibt's da irgendeinen Grund für ?



  • ja >> ist ein operator, hätten sie aber eigentlich lösen können, wenn ein mench erkennen kann das es sich um ein template instanzierung handelt sollte der compiler es auch können


Anmelden zum Antworten