2010-06-28 16 views
12

Ich möchte ein Bitset in C++ machen. Ich habe ein bisschen Nachforschungen angestellt. Alle Beispiele fand ich wo wie folgt aus:Bitset-Größe bei Initialisierung definieren?

bitset<6> myBitset; 
// do something with it 

Aber ich weiß nicht, die Größe des bitset wenn ich die Variable in meiner Klasse zu definieren:

#include <bitset> 
class Test 
{ 
public: 
    std::bitset *myBitset; 
} 

Dies wird nicht kompilieren ...

Und wie diese Initialisierung auch nicht arbeiten:

int size = getDependentSizeForBitset(); 
myBitset = new bitset<size>(); 
+1

Ich habe keine Ahnung, wofür das ist, aber Sie könnten immer einen Vektor verwenden, wenn es nicht zu groß sein wird. Dies ist besonders dann eine gute Option, wenn Sie in einer Umgebung arbeiten, in der kein Boost (dh ein beschissener Job) möglich ist. – Cam

+2

Das sollte eine Antwort sein, kein Kommentar. –

+1

Std :: Vektor ist nicht nur größer, aber deutlich langsamer (~ 5x) in der Anwendung, die mich auf diese Frage getrieben. – sdenham

Antwort

19

Boost hat eine dynamic_bitset, die Sie verwenden können.

Alternativ können Sie eine vector<bool> verwenden, die (leider) darauf spezialisiert ist, als Bitset zu fungieren. Dies verursacht eine Menge Verwirrung und wird im Allgemeinen als eine schlechte Idee betrachtet. Aber so funktioniert es. Wenn Sie das also brauchen, können Sie es auch nutzen, nehme ich an.

+0

+1. Es ist eine Schande, dass Vektor diese Spezialisierung hat und nicht nur eine separate Klasse. Es ist nicht so, dass es den Anbietern leichter gemacht wurde, es als Spezialisierung zu implementieren: es scheint geradezu albern. – stinky472

+0

ja. Leider glaube ich, dass der Ausschuss allen Vorschlägen widersprochen hat, ihn abzulehnen. – jalf

6
+0

Danke. Aber ich versuche meine Bewerbung so einfach wie möglich zu halten. Also, ich gehe für 'vector '. Andernfalls muss ich die zusätzliche Bibliothek installieren ... –

+0

Boost :: dynamic_bitset ist vollständig in Header-Dateien implementiert. Keine zusätzliche Bibliothek zum Installieren. –

1

Sie sollten überprüfen dynamisiert dynamic_bitset.

1

Was Sie am Anfang sagen, ist nicht wahr. Die "Beispiele, die du gefunden hast" sahen nicht so aus, wie du es gepostet hast. Es ist nicht möglich, einen nicht konstanten Wert zum Parametrisieren einer Vorlage zu verwenden. Also, dein erstes Beispiel ist ungültig. Nur konstante Ausdrücke können als Nicht-Typ-Argumente für eine Vorlage dienen. I.e. Das Nicht-Typ-Argument muss eine Kompilierzeitkonstante sein.

Es sieht so aus, als ob Sie ein Bitset erstellen möchten, dessen Größe keine Kompilierzeitkonstante ist. In diesem Fall kommt die Vorlage bitset nicht in Frage. Sie benötigen eine Implementierung von Runtime-Bitset. Zum Beispiel können Sie std::vector<bool> verwenden - in vielen (wenn nicht allen) Implementierungen ist diese Vorlage spezialisiert, um ein gepacktes Array von booleschen Werten zu implementieren, wobei jedes Element ein Bit belegt (im Gegensatz zu einem bool Objekt).

0

Bitset erfordert Größe als Vorlageparameter, dh die Größe muss zur Kompilierzeit bestimmt werden können. Es kann nicht auf einer Laufzeitbedingung basieren, wie Benutzereingaben.

Dafür sollten Sie std :: vector oder boost :: dynamic_bitset betrachten. std :: vector ist eine spezialisierte Template Instanziierung, die ein Bit pro Element verwendet. Im Gegensatz zu Bitset kann es dynamisch skaliert werden.

Verwandte Themen