问题标签 [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 投票
0 回答
96 浏览

c++ - 如何为具有代理引用的类编写非常量 getter 函数?

特别是我试图围绕 boost::dynamic_bitset 创建一些包装函数。有一个类似的问题,Overloading subscript operator for non-array elements尽管我希望在不创建额外类的情况下获得更紧凑的解决方案。相关片段:

使用 MSVC13_64 这不会给我任何错误,尽管它在测试时会产生非常奇怪的行为,使用 MinGW492_32 我会收到如下错误:

C:\repositories\..\logic\game_prim.h:78: 错误:从 'boost::dynamic_bitset<> 类型的右值对 'boost::dynamic_bitset<>::reference&' 类型的非常量引用的初始化无效::reference' BitWorld::reference& operator[](int index) { return grid.world[index]; } ^

我不明白为什么他们让代理引用上的变异操作变得如此重要。简单的转换也不起作用, const_cast 不能在右值和左值引用之间转换,我也没有在 static_cast 上取得太大的成功。

0 投票
0 回答
390 浏览

c++ - 使用 64 位编译时 boost::dynamic_bitset 的 unordered_map 较慢

我遇到了一个有趣的性能问题。

我在 Windows 上工作,在 Visual Studio 2015 中。

我有一个程序目前依赖于 Boost 的动态位集。当我将它编译为 32 位程序时,它运行良好且快速。但是当我将它编译为 64 位程序时,它的速度要慢得多。

分析后,以下功能分别从几乎没有时间到 69% 和 22%:

lower_bound

_Insert

两者都在include/xhashVisual C++ 头库中定义。但是,我对动态位集持怀疑态度,因为它们是被散列的内容。

VSet他们所指的类型是boost::dynamic_bitset我写的一个浅包装器,其散列函数定义如下:

几个有趣的细节:

  • Linux 上的 Clang 不会发生相同的性能问题。我还不能在 Windows 上用 Clang 测试它。
  • 据我所知,我对 x86 和 x64 使用相同的优化器设置。

我的问题:

  • 是否存在使用64 位unordered_mapboost::dynamic_bitset64 位的已知“陷阱”?特别是,因为动态位集正在做一些位旋转的东西。

  • VS 中是否有特定的优化器设置,我应该对其进行调整以避免这种情况?

  • 在编译 Boost 库以防止这种情况时,我可能需要做些不同的事情吗?

0 投票
2 回答
281 浏览

c++ - 从 uint16 提升 dynamic_bitset 复制位

我需要创建 24 位集。第一个 (0) 位必须由 bool 设置。和其他(1 - 23)我需要从 uint32 值复制第一位

是否可以使用 dynamic_bitset 做到这一点?

我尝试过但错误的代码:

0 投票
0 回答
300 浏览

c++ - Boost 的 dynamic_bitset 中 count() 的实现

我正在分析一些使用 a 的代码,dynamic_bitset<>我发现我的瓶颈出现在count()函数中,需要在 for 循环中调用数百万次。简而言之,for 循环采用成对的位集,使用 计算集合交集&,然后使用 保存汉明权重count()

为了与<bitset>STL 中的常规进行比较,我将 bitset 实现为 long 数组并使用__builtin_popcountl()(used in <bitset>),发现它要慢得多 - 大约慢 50%。有没有人看过 boost 的do_count()函数,在 中找到<boost/detail/dynamic_bitset.hpp>,因为它使用了一些我完全不理解的查找表。

更清楚地说,我的问题是为什么 Boost 的do_count()效率比__builtin_popcount()?

0 投票
1 回答
361 浏览

c++ - 为什么我需要在一个临时的 dynamic_bitset 上调用 std::move?

我在这里讲述一个冗长的背景故事,因为除了直接回答之外,我想知道导致这种情况的推理是否正确。

我有一个带dynamic_bitset<>参数的函数(来自Boost.dynamic_bitset)。说它看起来像这样。

碰巧它只使用从构造函数构建的临时foo(boost::dynamic_bitset<>{5}.set())对象调用,如(使用所有位设置的 5 位位集调用)。

我的位集只有少量位(少于 32 个)。所以一开始,我想“我只是按值传递它;副本比指针小。” 但后来我想“它是动态的,所以它必须在堆上分配空间。我想避免不必要的分配和释放。”

所以,我可以做到

但是一个引用是一个指针,而一个dynamic_bitset(大概)有一个指向它的数据的指针,所以使用dbwithinfoo会经历两层间接,这看起来很愚蠢。显然,最好的方法是将指向数据的指针复制到 中foo,而无需重新分配和复制堆上的数据。

“啊哈!” 我说。“当然,这就是移动语义的用途。” 所以,我将签名更改为

但是,调用foo(boost::dynamic_bitset<>{5}.set())会产生编译器错误,cannot bind 'boost::dynamic_bitset<>' lvalue to 'boost::dynamic_bitset<>&&'. 我必须改为打电话 foo(std::move(boost::dynamic_bitset<>{5}.set())) ,然后一切正常。

为什么我需要调用 std::move? 这似乎很明显是一个 xvalue(一个临时的即将到期),不是吗?

0 投票
1 回答
425 浏览

boost - 将 dynamic_bitset 转换为 std::bitset

我有一个应用程序,我需要在运行时动态分配一个位集,所以我不得不使用boost::dynamic_bitset. 但是,出于效率原因,我希望最终将数据用作std::bitset. 我该如何从boost::dynamic_bitsetto转换std::bitset

0 投票
1 回答
1181 浏览

c++ - boost::dynamic_bitset 如何存储位

我很难理解 boost:::dynamic_bitset 或 std::vector 在内部做什么。我最终想要做的是组成一个网络框架并通过套接字发送它,但我无法以保持我组装的位顺序的方式转换它们......

我知道该类重载了 << 流运算符,因此我有正确的输出,而 printf 似乎显示了原始结构。对我来说似乎甚至不是确定性的(下面重复执行相同的 .exe 而不重新编译):

命令

我的问题:

  1. 基本上在引擎盖下会发生什么?显然它根本无法与数组相提并论。
  2. 如何通过套接字 send() 发送这样的位集?
0 投票
0 回答
129 浏览

c++ - 大型数据集的动态位集提升

我正在将一个非常大的数据写入文件,它是霍夫曼编码的结果,我需要将其保存到文件中并稍后读取。我遇到了使用 dynamic_bitset 处理位的想法。我已经在小数据上测试了我的代码,它工作正常,但在更大的数据(编码图像)上它失败并崩溃。这就是我试图保存的变量的样子:

但是,当我使用函数 size() 时,它返回 16,这让我很困惑。我尝试测试将其转换为 unsigned long 但它引发异常。我想知道动态 bit_set 可以处理多少数据以及为什么 m_num_bits 不等于 size()。我会欣赏任何想法和想法。

0 投票
1 回答
278 浏览

c++ - 使用动态位集转换十进制数

我正在解决一个 leetcode 问题,它的输出需要是一个没有大量数字的二进制数。

我有十进制数,我试图使用 bitset 进行转换。

我写了一个函数来返回给定数字 n 的位数:

但是当我调用它时,

数字必须是常数。我阅读了 boost::bitset,但看不到如何使用动态位集来解决我的问题。 http://www.boost.org/doc/libs/1_63_0/libs/dynamic_bitset/dynamic_bitset.html

因为它是手动定义每一位的。它不再转换为二进制。

0 投票
1 回答
124 浏览

c++ - 将 boost::dynamic_bitset<> 插入 boost::bimap

我正在尝试boost::dynamic_bitset<>插入boost::bimap. 但是,与插入整数或字符串相比,它非常慢。给出了最小的例子,代码如下所示

对于 500 万个字符长的字符串,将整数/字符串插入bimap. 为什么boost::dynamic_bitset<>很慢,我该如何改进它。