SeqAn3中的容器与视图
1. 容器
1.1 位压缩容器
在C++中,单个对象若单独存储,至少需要一个字节的内存空间。但实际上,几乎所有字母表都可以用更少的位来表示。因此,通过位压缩存储可以节省大量的存储空间,即不单独存储元素,而是以压缩形式存储。
可以使用 seqan3::bitcompressed_vector 来实现这一点,它的接口与 std::vector 几乎相同。不过,由于元素不是相邻存储的(它们被压缩了),这种类型仅满足 std::ranges::random_access_range 概念,而不满足更强的 std::ranges::contiguous_range 概念。位压缩向量要求其元素是字母表类型,并且可以默认构造(所有容器都有此要求)。
在SeqAn2中,有类似的类型 seqan::String<T, seqan::Packed<THostSpec>> 。SeqAn3的实现内部使用了SDSL库中的 sdsl::int_vector ,但提供了完整的容器接口,并能进行与秩的转换(转换后的秩存储在 sdsl::int_vector 中)。当调用容器的 operator[] 或解引用其迭代器时,会返回一个代理类型,该类型派生自实际的字母表类型(并且可以转换为该类型),但提供了自定义的赋值运算符,以便正确更新底层数据。这与访问 seqan3::alphabet_tuple_ba
超级会员免费看
订阅专栏 解锁全文

29

被折叠的 条评论
为什么被折叠?



