问题标签 [boost-dynamic-bitset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
307 浏览

c++ - 为什么 boost::dynamic_bitset 是一个模板?

我以前用过boost::dynamic_bitsetas boost::dynamic_bitset<>,没有真正考虑过为什么要模板化。

虽然我可以理解为什么std::bitset是模板化的(模板类型用于指定位集的大小),但我现在遇到了一些表单代码,boost::dynamic_bitset<unsigned char>我无法弄清楚模板类型的意义何在。

有什么boost::dynamic_bitset<unsigned char>不同boost::dynamic_bitset<>?在任何情况下都应该使用一个而不是另一个吗?

0 投票
1 回答
313 浏览

c++ - 使用 boost::dynamic_bitset 作为键值对序列化 boost::bimap

我有兴趣序列化一个boost::bimap包含boost::dynamic_bitset,以便我可以保存它并在需要时加载回来。我已经尝试过这样做,但我遇到了很多错误。我随身携带的代码如下。

我该怎么做?。

编辑_1:

在中显示编译器和链接器设置Eclispse(因为我在@sehe 提供的答案代码中遇到了一些错误)。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

EDIT_2

linux终端上使用的命令g++ -std=c++14 -Os -Wall -pedantic -pthread main.cpp -lboost_serialization && ./a.out

编辑 3 使用g++ -std=c++14 -Os -Wall -pedantic -pthread main.cpp -lboost_serialization && ldd a.out我得到以下信息

0 投票
1 回答
395 浏览

c++ - boost::dynamic_bitset<> 无论如何都以相反的顺序填充

我有一个代表 74MB 文件的所有位的大量位集。我正在使用压缩算法来创建此位集的压缩字符串表示。然后我需要将该字符串存储到另一个动态位集中,以便稍后对其进行解压缩。我的问题是,无论我如何尝试从字符串中填充位集,它总是以相反的顺序填充。

为简单起见,假设我的压缩字符串是

这是我第一次尝试填充输出动态位集:

当我这样做时,我的 bitset 变成了字符串的反转:

所以我尝试了这个:

我得到完全相同的输出。接下来我尝试使用反向迭代器,我不知道这是怎么可能的,但它以完全相同的方式填充位集:

我可以让我的 bitset 以正确的顺序填充的唯一方法是这样做:

这会以正确的顺序填充我的输出位集,但是它比使用其他方法慢得多(我正在使用的字符串慢 30 秒)。我还可以使用 std::reverse 将字符串反转到位然后填充位集,但这需要很多额外的时间。有什么方法可以有效地用正常排序的字符串中的值填充动态位集?我理解为什么它是反向填充的,但我没有使用我的位集来表示一个整数,我使用它来存储文件中的数据,所以我需要它是有序的。然而,为什么使用反向迭代器会产生相同的输出是没有意义的。

编辑我已经截取了我的输出和我的代码的相关部分。压缩输出显示了我的 bitset 压缩版本的前 6000 个字符,存储为字符串。这个字符串本身没有问题。红色下划线是我用来将此字符串存储在 bitset boost::dynamic_bitset 输出中的行。然后,我打印输出位集的前 6000 个字符,它们完全不同。我应该注意,“输出”位集作为参考参数传递给这个函数,但最初是空的。 输出

0 投票
1 回答
279 浏览

c++ - 从字符串向量填充 boost::dynamic_bitset<> 的最快方法

我正在实现一个使用霍夫曼编码压缩文件的程序。我无法将压缩字符串的位写入另一个位集。我有一个字节向量(8 位整数)和一个字符串向量 huffCodes,它的大小为 256,用于存储每个索引的位字符串。(比如0用11表示,1用11011表示,等等。)

这是我目前的方法:

这会遍历每个字节并从 huffCodes 向量中获取其相应的位串,然后将该字符串附加到压缩字符串中。压缩字符串完成后,会将其转换为位集。这种方法的问题在于它非常缓慢地填充位集,因为我的向量中有 7200 万字节。不过我不喜欢这种方法,因为似乎没有必要填充这个巨大的字符串来将其转换为位集。我更喜欢这样的东西:

显然这不是真正的代码,但理想情况下,我会在从 huffCodes 向量中收集所有字符串的同时填充输出位集。是否可以通过某种连接或将字符串附加到位集来做到这一点?

注意:huffCodes 向量的内容是大小为 8 的字符串,仅由 1 和 0 组成

0 投票
1 回答
472 浏览

c++ - 使用 boost::dynamic_bitset<> 填充 uint16_t 的向量

我正在创建一个使用 Huffman 压缩来压缩文件的程序。最初我使用 uint8_t 的向量来存储文件中的字节,但性能很糟糕(解压缩 74 MB 文件需要 2 小时)。我决定使用 16 位块来表示文件中的值。

最初,我有这个(输入位集有 5.2 亿位)

这很好用,它填充了一个充满 8 位整数的向量,代表文件的每个字节。每个位的频率都记录在一个大小为 256 的整数向量中。这运行得非常糟糕。解码一个字符串绝对需要永远,因为我的文件中这些整数的频率是巨大的。我认为如果我使用 16 位整数并将频率存储在大小为 65536 的向量中会更好。这是我尝试填充“字节”向量的尝试:

这里的问题是 to_block_range() 函数从我的位集中取出 8 位并用 8 个零填充它们,而不是一次取出 16 个字节。

有没有办法以这种方式从动态位集中填充 uint16_t 向量?

0 投票
0 回答
243 浏览

c++ - C++ 更改每个 boost::dynamic_bitset 块的位

我有一个具有 boost::dynamic_butset 输入的文件。该文件以 8 位块的形式存储块。然后,它被传递到允许我编辑的文件中的一个函数中。问题是,我需要将此位集的位存储到 16 位整数而不是 8 位整数的向量中。

我试过这个

但它说由于类型不同,没有匹配的函数调用。如何将这个原始位集存储在向量中?我使用的输入位集绝对是巨大的,因此使用 for 循环移动所有内容是不可能的。

0 投票
1 回答
551 浏览

c++ - 将 boost::dynamic_bitset 转换为字符串会增加 8 倍的大小

我正在尝试将 aboost::dynamic_bitset转换为 a string,以便将其传递给压缩函数。我可以使用它来转换它,boost::to_string但它会导致多 8 倍的位。当我从 转换回 时stringboost::dynamic_bitset它不会将使用的位数减少 8 倍,这将解决我的问题,因为它会导致使用的空间总量最终将是原始压缩位数。

我希望从 -> 开始时停止 8 倍增加,或者从boost::dynamic_bitset->开始string时减少 8 倍使用的空间。boost::dynamic_bitsetstring

存储的数据boost::dynamic_bitset来自二进制文件。这是我正在使用的,但理论上任何具有二进制数据的文件都应该可以工作。

当输出位数时,我调用string.size()它以字节为单位返回大小,因此我乘以 8。boost::dynamic_bitset.size()以位为单位返回大小,所以我的输出应该是比较苹果和苹果,假设一切都是正确的。

这是我目前得到的输出:

这是我的代码:

0 投票
1 回答
335 浏览

c++ - boost::dynamic_bitset 结果与 std::vector 不一致?

我查看了 boost 的实现,dynamic_bitset发现他们比较了底层整数存储类型以提高operator<性能,我用下面的代码测试了正确性并得到了不一致的结果。这是一个错误吗?

我希望两者的输出都是1,但第二个输出是0.

0 投票
1 回答
124 浏览

c++ - 如何逻辑或两个不同大小的 boost::dynamic_bitset 对象?

API 不允许对不同大小的 dynamic_bitsets 应用逻辑操作,而我的应用程序要求如果其中一个位集大于另一个,则相应地调整结果大小。我必须创建一个临时副本来解决问题:

我可以在 API 中看到函数 to_block_range() 和 from_block_range() 理论上可用于访问位集,但它们似乎太有限而无法实现不同大小的位集的逻辑或。

0 投票
1 回答
230 浏览

c++ - 是 boost dynamic_bitset 仅标头

根据所有初始迹象,boost dynamic_bitset只是标题。

文档暗示它只是标题:

类 dynamic_bitset 在头文件 boost/dynamic_bitset.hpp 中定义。此外,在头文件 boost/dynamic_bitset_fwd.hpp 中有一个 dynamic_bitset 的前向声明。

该库未出现在入门文档中的“非仅标头”库列表中:

提升入门

最后,bootstrap.sh --show-libraries在我的本地系统上使用 Boost 1.70.0 的命令并未dynamic_bitset列为需要单独构建和安装的命令:

但是,当我使用bcp --list列出依赖项以便仅使用此库时,包含 .cpp 文件:

因此,我得出结论,bcp副本不会仅包含头文件。

Boostdynamic_bitset真的只有标题吗?如果是这样,我如何在我的项目中只包含相关的标题?