c++ - std::bitset - 如何迭代 "set"(或 "not set")位?

标签 c++ stl bitset

<分区>

我在我的代码中使用了 bitset:

std::bitset<MAX_INSTRUMENTS_NUMBER_IN_SYSTEM> updatedInstruments;

通常我只需要迭代“设置”(或“未设置”)的值,这就是我的做法:

for (int instrumentId = 0; instrumentId < MAX_INSTRUMENTS_NUMBER_IN_SYSTEM; instrumentId++) {
    if (!updatedInstruments[instrumentId]) {
        continue;
    }
    // work
}

能否改进此迭代以使其更具可读性并可能更快?

最佳答案

我认为您不能使用 std::bitset 来利用代码中设置位的连续性:接口(interface)不提供任何帮助完成此任务,并且没有合法的方式来访问底层存储并直接使用它。1

如果您有能力更换容器,您可以找到几个更好的替代品。 Here例如,是一个类似于位集的结构,它为事件位提供“枚举器”(它似乎主要是在图像上处理跨度),并且在我上面链接的拷贝中,还有其他一些关于更专门用于此用例的数据结构的建议。


  1. 之前我认为迭代器可能会产生一些性能优势,但结果是 std::bitset没有迭代器 :-o 此外,对 std::vector<bool> 执行了类似的测试(这应该或多或少地以相同的方式打包位)使用带有 g++ 和 clang++ 的迭代器使速度降低了约 2 倍。

关于c++ - std::bitset - 如何迭代 "set"(或 "not set")位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290707/

相关文章:

c++ - 使用 VS2010 的 C++ 中的位集(另一个)

c++ - 同一用户定义类型的 STL 集和映射

c++ - c++ std::bind 返回值如何分配给 std::function?

c++ - 将 bitset 转换为 unsigned char,反之亦然

c++ - 跳转到最后一个元素的最大方式数

c++ - 在 C++ 中使用自定义结构作为映射索引时出现 "invalid operands to binary expression"

java - 为什么 BitSet 不可迭代?

c++ - noexcept 没有被腐烂去除

c++ - 如何确定使用 ShellExecuteEx 创建的进程是否拥有一个窗口?

c++ - 我究竟应该如何为数组实现随机数或随机数算法以随机顺序显示引号?