【问题标题】:Iterating through a boost::dynamic_bitset遍历 boost::dynamic_bitset
【发布时间】:2011-01-13 19:44:46
【问题描述】:

我有一个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 的最佳方法,还是有其他方法?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

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

    注意dynamic_bitsetdoes not have iterators,所以无论如何它都会表现得有点不像C++。

    【讨论】:

    • @Iarsmans:谢谢。如果没有关于它的示例,我认为也许有更好的方法,但是根据您的解释,我们真的不能期望比这更好。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 2017-01-14
      • 2015-09-09
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多