问题标签 [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.
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 上取得太大的成功。
c++ - 使用 64 位编译时 boost::dynamic_bitset 的 unordered_map 较慢
我遇到了一个有趣的性能问题。
我在 Windows 上工作,在 Visual Studio 2015 中。
我有一个程序目前依赖于 Boost 的动态位集。当我将它编译为 32 位程序时,它运行良好且快速。但是当我将它编译为 64 位程序时,它的速度要慢得多。
分析后,以下功能分别从几乎没有时间到 69% 和 22%:
lower_bound
:
_Insert
:
两者都在include/xhash
Visual C++ 头库中定义。但是,我对动态位集持怀疑态度,因为它们是被散列的内容。
VSet
他们所指的类型是boost::dynamic_bitset
我写的一个浅包装器,其散列函数定义如下:
几个有趣的细节:
- Linux 上的 Clang 不会发生相同的性能问题。我还不能在 Windows 上用 Clang 测试它。
- 据我所知,我对 x86 和 x64 使用相同的优化器设置。
我的问题:
是否存在使用64 位
unordered_map
或boost::dynamic_bitset
64 位的已知“陷阱”?特别是,因为动态位集正在做一些位旋转的东西。VS 中是否有特定的优化器设置,我应该对其进行调整以避免这种情况?
在编译 Boost 库以防止这种情况时,我可能需要做些不同的事情吗?
c++ - 从 uint16 提升 dynamic_bitset 复制位
我需要创建 24 位集。第一个 (0) 位必须由 bool 设置。和其他(1 - 23)我需要从 uint32 值复制第一位
是否可以使用 dynamic_bitset 做到这一点?
我尝试过但错误的代码:
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()
?
c++ - 为什么我需要在一个临时的 dynamic_bitset 上调用 std::move?
我在这里讲述一个冗长的背景故事,因为除了直接回答之外,我想知道导致这种情况的推理是否正确。
我有一个带dynamic_bitset<>
参数的函数(来自Boost.dynamic_bitset)。说它看起来像这样。
碰巧它只使用从构造函数构建的临时foo(boost::dynamic_bitset<>{5}.set())
对象调用,如(使用所有位设置的 5 位位集调用)。
我的位集只有少量位(少于 32 个)。所以一开始,我想“我只是按值传递它;副本比指针小。” 但后来我想“它是动态的,所以它必须在堆上分配空间。我想避免不必要的分配和释放。”
所以,我可以做到
但是一个引用是一个指针,而一个dynamic_bitset(大概)有一个指向它的数据的指针,所以使用db
withinfoo
会经历两层间接,这看起来很愚蠢。显然,最好的方法是将指向数据的指针复制到 中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(一个临时的即将到期),不是吗?
boost - 将 dynamic_bitset 转换为 std::bitset
我有一个应用程序,我需要在运行时动态分配一个位集,所以我不得不使用boost::dynamic_bitset
. 但是,出于效率原因,我希望最终将数据用作std::bitset
. 我该如何从boost::dynamic_bitset
to转换std::bitset
?
c++ - 大型数据集的动态位集提升
我正在将一个非常大的数据写入文件,它是霍夫曼编码的结果,我需要将其保存到文件中并稍后读取。我遇到了使用 dynamic_bitset 处理位的想法。我已经在小数据上测试了我的代码,它工作正常,但在更大的数据(编码图像)上它失败并崩溃。这就是我试图保存的变量的样子:
但是,当我使用函数 size() 时,它返回 16,这让我很困惑。我尝试测试将其转换为 unsigned long 但它引发异常。我想知道动态 bit_set 可以处理多少数据以及为什么 m_num_bits 不等于 size()。我会欣赏任何想法和想法。
c++ - 使用动态位集转换十进制数
我正在解决一个 leetcode 问题,它的输出需要是一个没有大量数字的二进制数。
我有十进制数,我试图使用 bitset 进行转换。
我写了一个函数来返回给定数字 n 的位数:
但是当我调用它时,
数字必须是常数。我阅读了 boost::bitset,但看不到如何使用动态位集来解决我的问题。 http://www.boost.org/doc/libs/1_63_0/libs/dynamic_bitset/dynamic_bitset.html
因为它是手动定义每一位的。它不再转换为二进制。
c++ - 将 boost::dynamic_bitset<> 插入 boost::bimap
我正在尝试boost::dynamic_bitset<>
插入boost::bimap
. 但是,与插入整数或字符串相比,它非常慢。给出了最小的例子,代码如下所示
对于 500 万个字符长的字符串,将整数/字符串插入bimap
. 为什么boost::dynamic_bitset<>
很慢,我该如何改进它。