C++ C+中是否存在类似于deque的位集+;?

C++ C+中是否存在类似于deque的位集+;?,c++,vector,boolean,deque,bitset,C++,Vector,Boolean,Deque,Bitset,我试图存储一个非常大的带有位过滤器的搜索掩码 std::vector和std::bitset都将它们的bool表示存储为位,这与通常为char或int32\t大小的普通bool不同 问题是这两种数据结构都将其元素存储在一个巨大的块中。操作系统因为我请求的块太大而对我发火。我认为,std::deque所做的一件事就是将其元素存储在类似链表的东西中 现在我知道,如果不移位,就不能使用指向单个位的指针,而使用链表类型的结构会破坏内存节约的目的。但是你可以像存储一个2gb的char[],使用移位来设置单

我试图存储一个非常大的带有位过滤器的搜索掩码

std::vector
std::bitset
都将它们的bool表示存储为位,这与通常为
char
int32\t
大小的普通bool不同

问题是这两种数据结构都将其元素存储在一个巨大的块中。操作系统因为我请求的块太大而对我发火。我认为,
std::deque
所做的一件事就是将其元素存储在类似链表的东西中

现在我知道,如果不移位,就不能使用指向单个位的指针,而使用链表类型的结构会破坏内存节约的目的。但是你可以像存储一个2gb的
char[]
,使用移位来设置单个位,然后用一个链接指针指向另一个2gb的块,你明白吗


因此,请告诉我这种类型的结构是否存在或甚至可能存在。

一个专用于所需“块”类(例如,无符号字符[N],或一个包装类(为了方便起见),带有自定义相等和对相应块进行操作的位运算符的deque/队列可以实现这一点

这些自定义按位方法需要根据修改操作将操作的每个输入“全局”位索引转换为一组(块编号、块本地)索引,从而确定要操作的块/范围。非修改操作/查询可以实现为对所有块的简单遍历

一般的想法是将位掩码拆分为块,并对这些块序列进行操作,因为根据内存碎片,在运行时可能无法分配2GB或更多的连续内存。当然,块大小越小,处理开销、缓存一致性降低和内存碎片就越大。然而,在客户端应用程序中,您可能会从内存中挤出更多内存


正如@Crog提到的那样,似乎已经有了一个实现:

我不知道您可以使用多少2GB块。但假设您需要2048个2GB块。那么为什么不将指向2GB块的指针存储在一个向量中,例如,
std::vector
,并在需要扩展结构时将新的2GB块添加到此向量中。

我不知道有什么直接的解决方案可以解决您的问题,但可以通过自定义容器轻松解决

一种解决方案只涉及std::bitset的std::deque。其中,位集的大小是2的幂,例如256。使用此选项,您可以获取索引,并仅分别屏蔽deque索引和位集索引:

std::deque< std::bitset<256> > ;
unsigned long long = 1500;

bool val = bigBitset[ index>>8 ][ index & 0xFF ];
std::deque;
无符号长=1500;
bool val=bigBitset[index>>8][index&0xFF];
为了方便起见,还可以将其封装在类中:

class DequeBitset : public std::deque< std::bitset<256> >
{
public:
    struct Index
    {
        unsigned long index;

        unsigned long dequeIndex() const { return index>>8; }       
        unsigned long bitsetIndex() const { return index&0xFF; }
        Index( unsigned long index ) : index(index) {}
    };
public:

    bool operator[]( const Index& index )
    { return std::deque< std::bitset<256> >::operator [](index.dequeIndex())[ index.bitsetIndex() ]; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    DequeBitset test;
    test.resize(10);
    bool val = test[259];
    return 0;
}
class-DequeBitset:public-std::deque
{
公众:
结构索引
{
无符号长索引;
无符号长dequeIndex()常量{return index>>8;}
无符号长bitsetIndex()常量{return index&0xFF;}
索引(无符号长索引):索引(索引){}
};
公众:
布尔运算符[](常量索引和索引)
{返回std::deque::运算符[](index.dequeIndex())[index.bitsetIndex()];}
};
int _tmain(int argc,_TCHAR*argv[]
{
DequeBitset检验;
测试。调整大小(10);
布尔值=试验[259];
返回0;
}

遮罩会生长吗?或者您知道它在编译时的大小吗?直到运行时才知道它的大小,所以从技术上讲它必须是一个动态位集。Boost在库中有一个。您可能还想尝试Boost::dynamic_位集,但我认为从长远来看,它类似于std::vector。