我有一个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
的最佳方式,还是有另一种方式?
答案 0 :(得分:9)
find_first
和find_next
是最快捷的方式。原因是如果没有设置它们,它们可以跳过整个块(dynamic_bitset::bits_per_block
位,可能是32或64)。
请注意dynamic_bitset
does not have iterators,因此无论如何,它都会表现得有点非C ++。
答案 1 :(得分:1)
取决于您对更正确的定义。正确的方法可能必须在所有有效输入上产生正确的结果,并且足够快。
find_first
和find_next
存在,以便可以优化它们以在一次比较中扫描整个位块。如果一个块是,例如,无符号长64位,则一个块比较一次分析64位,其中像您发布的直接循环将为此进行64次迭代。