快速std :: vector <bool>重置

阿迪·沙维特(Adi Shavit)

我有一个的,其大小仅在运行时(即没有已知位(以百万计的“存在”位10秒)的大载体std::bitset),但实际使用之前已知的,因此容器可预先分配。

该向量最初是全零,并且以单个,增量,稀疏和随机的方式设置。我对这个容器的唯一使用是直接随机访问-检查“状态”(没有STL)。在尝试了几种替代容器之后,这似乎std::vector<bool>很适合我的需求(尽管存在概念上的问题)。

偶尔我需要重置此向量中的所有位。
由于它是如此之大,所以我无法完全重置所有元素。但是,我知道所有设置位的索引,因此可以单独重置它们。

由于std::vector<bool>bools表示为位,因此每次此类重置都涉及额外的移位和其他此类调整操作。

是否有(便携式)方式进行“粗略”,低精度的重置?
一个将重置我请求的位所属整个整数,从而避免任何额外的额外操作的方法?

丹维尔

方法1“密集”

如果你需要一个“密”容器我会建议你使用的混合物vectorbitset

我们将位存储为位组序列,因此可以bitset::reset在每个“块”上使用以将它们全部重置。DynamicBitset::resize可用于为正确的位数腾出空间。

class DynamicBitset
{
private:
    static const unsigned BITS_LEN = 64; // or 32, or more?
    typedef std::bitset<BITS_LEN> Bits;
    std::vector<Bits> data_;
public:
    DynamicBitset(size_t len=0) {
        resize(len);
    }
    // reset all bits to false
    void reset() {
        for(auto it=data_.begin(); it!=data_.end(); ++it) {
            it->reset(); // we can use the fast bitfield::reset :)
        }
    }
    // reset the whole bitset belonging to bit i
    void reset_approx(size_t i) {
        data_[i/BITS_LEN].reset();
    }
    // make room for len bits
    void resize(size_t len) {
        data_.resize(len/BITS_LEN + 1);
    }
    // access a bit
    Bits::reference operator[](size_t i) {
        size_t k = i/BITS_LEN;
        return data_[k][i-k*BITS_LEN];
    }
    bool operator[](size_t i) const {
        size_t k = i/BITS_LEN;
        return data_[k][i-k*BITS_LEN];
    }
};

方法2“稀疏”

如果存储只有极少数的位,你也可以去用的混合物mapbitset

在这里,我们仅在其中至少设置了位的情况下存储块。这需要访问位,因此需要额外的开销,因为我们需要查找std::map具有的O(log N),但是占用的内存少得多。

此外,功能重置功能完全符合您在问题中所说的内容-它仅涉及您已设置的区域。

SparseDynamicBitset 当您有很长的位序列(始终为false)时,例如对于1000 ... 000100 ... 010,而不是0101000111010110,则是一个不错的选择。

class SparseDynamicBitset
{
private:
    static const unsigned BITS_LEN = 64; // ?
    typedef std::bitset<BITS_LEN> Bits;
    std::map<unsigned,Bits> data_;
public:
    // reset all "stored" bits to false
    void reset() {
        for(auto it=data_.begin(); it!=data_.end(); ++it) {
            it->second.reset(); // uses bitfield::reset :)
        }
    }
    // access a bit
    Bits::reference operator[](size_t i) {
        size_t k = i/BITS_LEN;
        return data_[k][i-k*BITS_LEN];
    }
    bool operator[](size_t i) const {
        size_t k = i/BITS_LEN;
        auto it = data_.find(k);
        if(it == it.end()) {
            return false; // the default
        }
        return it->second[i-k*BITS_LEN];
    }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: vector <bool>优化实现

来自分类Dev

如何为std :: vector <std :: vector <bool >>编写哈希函数

来自分类Dev

循环范围和std :: vector <bool>

来自分类Dev

std :: vector <bool>如何声明/定义?

来自分类Dev

从std :: vector <bool>获取布尔参考

来自分类Dev

std :: vector <bool>上的运算符| =

来自分类Dev

通过MPI发送C ++ std :: vector <bool>

来自分类Dev

std :: vector <bool>如何声明/定义?

来自分类Dev

OpenCL和std :: vector <bool>不兼容

来自分类Dev

`std :: vector`的快速哈希函数

来自分类Dev

在std :: bitset和std :: vector <bool>之间转换

来自分类Dev

如何在std :: vector <bool>中建立索引?

来自分类Dev

std :: vector <bool> :: resize的最终默认参数是否为标准?

来自分类Dev

将二进制文件读入std :: vector <bool>

来自分类Dev

C ++-将char引用转换为bool Referenece(std :: vector <bool>)

来自分类Dev

关于 std::vector 快速排序的问题

来自分类Dev

同时写入vector <bool>

来自分类Dev

根据vector <bool>的内容对vector <vector <bool >>进行排序

来自分类Dev

快速重置transitionInView

来自分类Dev

快速重置transitionInView

来自分类Dev

建议使用unsigned int代替std :: vector <bool>或std :: bitset吗?

来自分类Dev

建议使用unsigned int代替std :: vector <bool>或std :: bitset吗?

来自分类Dev

如何将std :: vector <bool>转储到二进制文件中?

来自分类Dev

C ++ std :: vector <bool>使用drmemory给出未初始化的读取错误

来自分类Dev

忽略模板的特殊化,并显式使用未特殊化的模板(std :: vector <bool>)

来自分类Dev

指向std :: vector <bool>的元素时发生编译器错误?

来自分类Dev

bcc32:专门研究“ std :: vector <bool>”时出现奇怪的错误

来自分类Dev

std :: vector <bool>的单比特上的按位运算。为什么会出错?

来自分类Dev

指向std :: vector <bool>的元素时发生编译器错误?

Related 相关文章

  1. 1

    std :: vector <bool>优化实现

  2. 2

    如何为std :: vector <std :: vector <bool >>编写哈希函数

  3. 3

    循环范围和std :: vector <bool>

  4. 4

    std :: vector <bool>如何声明/定义?

  5. 5

    从std :: vector <bool>获取布尔参考

  6. 6

    std :: vector <bool>上的运算符| =

  7. 7

    通过MPI发送C ++ std :: vector <bool>

  8. 8

    std :: vector <bool>如何声明/定义?

  9. 9

    OpenCL和std :: vector <bool>不兼容

  10. 10

    `std :: vector`的快速哈希函数

  11. 11

    在std :: bitset和std :: vector <bool>之间转换

  12. 12

    如何在std :: vector <bool>中建立索引?

  13. 13

    std :: vector <bool> :: resize的最终默认参数是否为标准?

  14. 14

    将二进制文件读入std :: vector <bool>

  15. 15

    C ++-将char引用转换为bool Referenece(std :: vector <bool>)

  16. 16

    关于 std::vector 快速排序的问题

  17. 17

    同时写入vector <bool>

  18. 18

    根据vector <bool>的内容对vector <vector <bool >>进行排序

  19. 19

    快速重置transitionInView

  20. 20

    快速重置transitionInView

  21. 21

    建议使用unsigned int代替std :: vector <bool>或std :: bitset吗?

  22. 22

    建议使用unsigned int代替std :: vector <bool>或std :: bitset吗?

  23. 23

    如何将std :: vector <bool>转储到二进制文件中?

  24. 24

    C ++ std :: vector <bool>使用drmemory给出未初始化的读取错误

  25. 25

    忽略模板的特殊化,并显式使用未特殊化的模板(std :: vector <bool>)

  26. 26

    指向std :: vector <bool>的元素时发生编译器错误?

  27. 27

    bcc32:专门研究“ std :: vector <bool>”时出现奇怪的错误

  28. 28

    std :: vector <bool>的单比特上的按位运算。为什么会出错?

  29. 29

    指向std :: vector <bool>的元素时发生编译器错误?

热门标签

归档