Kleiner Datentyp gesucht bzw. programmieren



  • 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



  • Gibt's da irgendeinen Grund für ?

    Ja. Er heißt maximal munch. Einfach mal bei google eingeben. Der erste Link ist bereits sehr interessant.

    @Dimah
    Immer auf die armen Compilerbauer 😞
    Die C++ Grammatik ist sowieso schon so gemein.

    [ Dieser Beitrag wurde am 27.06.2002 um 13:51 Uhr von HumeSikkins editiert. ]



  • achso, thx



  • gabs da nicht mal die Möglichkeit, das mit einer Union zu machen

    struct Y
    {
       int LO2 : 2;
       int LO4 : 2;
       int HI6 : 2;
       int HI8 : 2;
    };
    union X
    {
       int GanzerInt;
       Y TeilInts;
    };
    

    kommt ein bisschen spät aber egal


Anmelden zum Antworten