C++ 迭代boost::dynamic_位集

C++ 迭代boost::dynamic_位集,c++,boost,C++,Boost,我有一个正在尝试从中提取设置位的文件: boost::dynamic_bitset<unsigned long> myBitset(1000); 我运行了一些测试,第二种方法似乎更有效,但这让我担心,可能还有另一种“更正确”的方法来执行此迭代。我在文档中找不到任何示例或注释来指示迭代设置位的正确方法 那么,使用find_first()和find_next()是迭代动态位集的最佳方法,还是有其他方法?find_first和find_next是最快的方法。原因是,如果没有设置这些位,它

我有一个正在尝试从中提取设置位的文件:

boost::dynamic_bitset<unsigned long> myBitset(1000);
我运行了一些测试,第二种方法似乎更有效,但这让我担心,可能还有另一种“更正确”的方法来执行此迭代。我在文档中找不到任何示例或注释来指示迭代设置位的正确方法


那么,使用
find_first()
find_next()
是迭代
动态位集的最佳方法,还是有其他方法?

find_first
find_next
是最快的方法。原因是,如果没有设置这些位,它们可以跳过整个块(每个块的
动态位集::位,可能是32或64位)


请注意,
动态\u位集
,因此无论发生什么情况,它的行为都有点不符合C++。

取决于您对“更正确”的定义。正确的方法可能必须在所有有效输入上产生正确的结果,并且速度足够快


find_first
find_next
都在那里,因此可以优化它们,以便在一次比较中扫描整个比特块。例如,如果一个块是一个64位的无符号长块,一个块比较一次分析64位,而像您所发布的那样一个简单的循环将为此进行64次迭代。

@Iarsmans:谢谢。如果没有一个例子,我想可能有更好的方法,但有了你的解释,我们真的不能期望比这更好。
for(size_t index = 0 ; index < 1000 ; ++index)
{
   if(myBitset.test(index))
   {
      /* do something */
   }
}
size_t index = myBitset.find_first();
while(index != boost::dynamic_bitset::npos)
{
        /* do something */
        index = myBitset.find_next(index);
}