繁体   English   中英

通过boost :: dynamic_bitset迭代

[英]Iterating through a 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的最佳方法,还是有另一种方法?

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

请注意, dynamic_bitset 没有迭代器 ,因此无论如何它都会表现出一些非C ++'ish。

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

find_firstfind_next存在,以便可以优化它们以在一次比较中扫描整个位块。 如果一个块是,例如,无符号长度的64位,则一个块比较一次分析64位,其中像您发布的直接循环将为此进行64次迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM