[Gelöst] Alternative zu std::vector



  • Hi zusammen,

    ich habe eine eigene templated Containerklasse, die intern std::vector benutzt, um ihre Elemente zu speichern. Dummerweise ist std::vector für bool spezialisiert und bringt einige unschöne Eigenschaften mit, die mir Kopfschmerzen bereiten.
    Lange Rede, kurzer Sinn: Gibt es eine Klasse, die die gleiche Funktionalität wie std::vector bietet, nur dass sie nicht für bool spezialisiert ist? Kann ruhig auch aus boost/TR1 sein, nur habe ich da bisher nichts gefunden.



  • Nimm doch einfach char. 🙂

    Ach ja, man könnte sonst z.B. deque anstatt vector nehmen.



  • auf bool spezialisiert? Wie soll man das verstehen?



  • zwutz schrieb:

    auf bool spezialisiert? Wie soll man das verstehen?

    Ein std::vector ist für bool spezialisiert, so dass intern ein Eintrag ein einzelnes Bit und nicht ein Byte ist. Bringt aber, wie der TO meint ein paar Probleme mit.

    C++0x soll dann das wieder rückgängig machen und intern normale bool's speichern. Im Moment könnte man das über einen bool Wrapper machen oder auch z.B über ein std::vector<char> gehen.



  • danke... ich hatte es so verstanden, dass vector am Besten für bool geeignet ist



  • zwutz schrieb:

    danke... ich hatte es so verstanden, dass vector am Besten für bool geeignet ist

    In den meisten Fällen macht std::bitset mehr Sinn.



  • Du kannst afaik auch "einfach" einen eigenen Allocator erstellen, welcher schlicht den Standardallocator wrappt. Wenn Du diesen dann beim Vector angibst wird - soweit ich weiss - nicht die spezialisierte Version genutzt.



  • <putintightnick> schrieb:

    Wenn Du diesen dann beim Vector angibst wird - soweit ich weiss - nicht die spezialisierte Version genutzt.

    Da weißt du leider was falsches. Der Standard gibt an, dass besagte Spezialisierung eben nur partiell ist:

    Der Standard schrieb:

    To optimize space allocation, a specialization of vector for bool elements is provided:

    namespace std {
      template <class Allocator> class vector<bool, Allocator> {
    [...]
    


  • Hallo,

    Danke für´s Feedback:

    @__Stefan__
    Im Moment benutze ich std::vector<char> statt std::vector<bool>, aber jetzt abe ich selber Spezialisierungen für meine Containerklasse und da muss ich die Datentypen bool und char voneinander unterscheiden können.
    std::deque scheidet aus, weil die Elemente linear im Speicher liegen müssen.

    @zwutz
    Für bool spezialisiert, nicht auf 😉

    @Drakon
    Hab mir gerade so einen Wrapper gebaut, muss mal schauen, ob´s damit zu Problemen kommt.

    @putintightnick + pumuckl
    pumuckl hat leider recht, auch ein custom allocator verhindert keine Spezialisierung.



  • ich weiß jetzt nicht sicher, ob der Compiler an der Stelle irgendwo Fehlermeldungen oder Warnungen wirft, aber ginge evtl sowas:

    template <class T>
    struct TypeMapper
    {
      typedef std::vector<T> type;
    };
    
    template <>
    struct TypeMapper<bool>
    {
      typedef std::vector<char> type;
    };
    
    template <class T>
    class Container
    {
      typedef typename TypeMapper<T>::type VectorType;
    
      VectorType myVector;
    
      /* ... */
    };
    


  • Ich habe jetzt eine simple wrapper Klasse für bool, zusammen mit boost.static_assert bekomme ich sogar ne´ lesbare Compiler Fehlermeldung, wenn ich versuche, bool statt bool_wrapper als Template Typ zu benutzen.
    Vielen Dank für die Antworten.


Anmelden zum Antworten