[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
boolelements 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.