c++ - 两个大型稀疏 vector 上的按位运算符没有循环?

标签 c++ std

我有三个大的任意稀疏 bool vector ,它们的大小都相同 - 比如:pool1 , pool2 , intersection_of_other_pools .我有兴趣执行按位运算符。如果我能做到那就太好了:intersection_of_other_pools |= pool1 | pool2 ,但据我所知,这似乎不是一个选择。

由于所有这些 vector 的大小都非常大,而且 pool1pool2非常稀疏,我会对一种循环对这些 vector 执行按位运算的方法感兴趣。我了解 std::vector<bool> 的幕后实现只是一个位数组,这使我相信可以在不循环的情况下执行此操作。

我对以速度为名的奇怪的按位破解解决方案持开放态度。

当然,如果最快(或唯一)的方法就是循环,那么我也很乐意接受它作为答案。

我已经 checkout valarray作为 vector 的潜在替代品,但我无法判断它是在循环还是在进行一些神奇的按位运算。但理想情况下,我不想更改现有代码库。

最佳答案

不要使用 std::vector<bool>或类似的稀疏数组。

真正的稀疏数组应该能够跳过大的部分。

将您的数据编码为 block header ,标明区域的长度(以字节为单位)。用length中全1表示“length字段的长度是原来的两倍长跟在后面”,递归。

所以 0xFF0100 说明后面有一个长度为 512 的 block 。 (您可以通过不允许 0 和 1-254 来做得更好,但这是舍入误差)。

“全 0”的交替 block 与混合的 1 和 0 的 block 。

不要直接读取区 block 头;使用 memcpy 对齐存储。

一旦你有了这个,你的 |&操作比按位操作更像是一个缝合。只有在两者都有非零 block 的极少数情况下,您才真正进行按位运算。

做完之后&您可能想检查是否有任何非 0 区域实际上全部为 0。

这假定一个极其稀疏的位域。像,每几万个中设置一个位就是一个典型的例子。如果稀疏是指“十分之一”,那么只需使用 uint64_t 的 vector 即可什么的。

关于c++ - 两个大型稀疏 vector 上的按位运算符没有循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56656122/

相关文章:

c++ - 如何在 C 或 C++ 代码中分隔数字常量(即 10,000)中的数字

c++ - 为什么LLVM选择开放寻址哈希表来实现llvm::StringMap?

c++指向基类的 vector 指针,以及访问多个派生类的方法

c - GCC ARM 链接器错误 - 未定义对 'strcmp' 的引用

C++ Overload Operator = for Pointers 不能正常工作/编译

c++ - 应用程序结束时 boost::shared_ptr 崩溃

c++ - sdl2摇杆不捕捉 "Pressed event"

c++ - 我们在哪里可以使用 std::barrier 而不是 std::latch?

c++ - 带有 push_back 的 libstdc++ 错误可复制 vecor 元素

c++ - 为什么编译器不帮助我们处理类型特征,而是求助于语言怪癖?