Iterating durch einen boost :: dynamic_bitset

8

Ich habe eine dynamic_bitset , die ich versuche, das Set zu extrahieren Bits von:

%Vor%

Mein erster Gedanke war, eine einfache 'Dump'-Schleife durch jeden Index zu machen und zu fragen, ob sie gesetzt war:

%Vor%

Aber dann sah ich zwei interessante Methoden, find_first() und find_next() , von denen ich sicher dachte, dass sie für diesen Zweck gedacht waren:

%Vor%

Ich habe einige Tests durchgeführt und es scheint, dass die zweite Methode effizienter ist, aber das beunruhigt mich, dass es möglicherweise eine andere "korrektere" Methode gibt, diese Iteration durchzuführen. Ich konnte keine Beispiele oder Hinweise in der Dokumentation finden, die den korrekten Weg zum Iterieren über die gesetzten Bits angeben.

Also, ist find_first() und find_next() der beste Weg, um über dynamic_bitset zu iterieren, oder gibt es einen anderen Weg?

    
JaredC 13.01.2011, 19:44
quelle

2 Antworten

7

find_first und find_next sind der schnellste Weg. Der Grund ist, dass diese einen ganzen Block überspringen können (von dynamic_bitset::bits_per_block Bits, wahrscheinlich 32 oder 64), wenn keiner von ihnen gesetzt ist.

Beachten Sie, dass dynamic_bitset keine Iteratoren hat Es wird sich ein bisschen un-C ++ verhalten, egal was passiert.

    
Fred Foo 13.01.2011, 19:48
quelle
1

Hängt von Ihrer Definition von korrekter ab. Eine korrekte Methode muss wahrscheinlich korrekte Ergebnisse für alle gültigen Eingaben liefern und schnell genug sein.

find_first und find_next sind vorhanden, so dass sie optimiert werden können, um ganze Blöcke von Bits in einem Vergleich zu scannen. Wenn ein Block zum Beispiel eine vorzeichenlose Länge von 64 Bits ist, analysiert ein Blockvergleich 64 Bits gleichzeitig, wobei eine einfache Schleife, wie Sie sie geschrieben haben, 64 Iterationen dafür ausführen würde.

    
Maxim Egorushkin 13.01.2011 19:58
quelle

Tags und Links