2011-01-13 82 views
8

我有一个boost dynamic_bitset,我试图从提取设置位:通过迭代一个boost ::来,dynamic_bitset

boost::dynamic_bitset<unsigned long> myBitset(1000); 

我的第一个想法是做一个简单的通过每个索引“倾倒”循环,并询问是否它被设置:

for(size_t index = 0 ; index < 1000 ; ++index) 
{ 
    if(myBitset.test(index)) 
    { 
     /* do something */ 
    } 
} 

但后来我看到两个有趣的方法,find_first()find_next(),我认为肯定是意味着这个目的:

size_t index = myBitset.find_first(); 
while(index != boost::dynamic_bitset::npos) 
{ 
     /* do something */ 
     index = myBitset.find_next(index); 
} 

我运行了一些测试,看起来第二种方法更高效,但这让我担心可能会有另一种“更正确”的方式来执行此迭代。我无法在文档中找到任何示例或注释,指出迭代设置位的正确方法。

那么,是使用find_first()find_next()迭代一个dynamic_bitset的最佳方式,还是有另一种方式?

回答

7

find_firstfind_next是最快的方法。原因是如果没有设置它们,它们可以跳过整个块(dynamic_bitset::bits_per_block位,可能是32或64)。

请注意,dynamic_bitsetdoes not have iterators,所以它会表现一点un-C++'ish无论如何。

+0

@Iarsmans:谢谢。没有关于它的例子,我想也许有更好的办法,但是根据你的解释,我们不能期望比这更好。 – JaredC 2011-01-13 20:35:56

1

取决于你的定义更正确。一个正确的方法可能必须在所有有效的输入上产生正确的结果并且足够快。

find_firstfind_next在那里,以便它们可以被优化以在一个比较中扫描整个比特块。如果一个块是64位的无符号长整型,那么一个块比较就会一次分析64位,在这个简单的循环中,你会发布64个迭代。