7

如果一个数组全为 0(或 false),我可以在 C(++) 中检查而不迭代/循环每个单个值并且不分配相同大小的新数组(使用memcmp)吗?

我滥用布尔数组在运行时拥有任意大的位集并对其进行一些位翻转

4

8 回答 8

7

您可以使用以下条件:

(myvector.end() == std::find(myvector.begin(), myvector.end(), true))

显然,在内部,这会遍历所有值。

另一种选择(实际上应该避免循环)是覆盖所有写访问函数,并跟踪是否true曾经被写入你的向量。

更新

Lie Ryan 在下面的评论中描述了一种基于相同原理的更稳健的方法。

于 2010-10-28T15:48:09.887 回答
2

如果没有排序,没有。你打算如何实现这一目标?您需要检查每个元素以查看它是否为 0!当然,memcmp 也会检查每个元素。因为它还要读取另一个数组,所以它会贵得多。

当然,您可以在遇到非 0 元素时尽早退出。

您唯一的选择是使用 SIMD(它在技术上仍然检查每个元素,但使用较少的指令),但您通常不会在通用数组中这样做。

(顺便说一句,我的回答假设您有一个简单的静态 C/C++ 数组。如果您可以指定您拥有的数组类型,我们可以更具体。)

于 2010-10-28T15:48:43.547 回答
1

如果您知道这将是一项要求,您可以构建一个由数组(可能是动态的)和一个计数或当前非零单元格组成的数据结构。显然单元格的设置必须通过抽象,但这在 c++ 中很自然,有重载,你可以在 c 中使用不透明类型。

于 2010-10-28T15:52:01.083 回答
1

考虑boost::dynamic_bitset改用。它有一个none成员和几个其他类似std::bitset的操作,但它的长度可以在运行时设置。

于 2010-10-28T15:59:47.960 回答
1

假设您有一个包含 N 个元素的数组,您可以对一组基向量进行一些检查。

例如,您有一个要测试的 15 元素数组。

您可以针对 8 元素零数组、4 元素零数组、2 元素零数组和 1 元素零数组对其进行测试。

只要知道要测试的数组的最大大小,就只需分配这些元素。此外,测试可以并行进行(如果需要,还可以使用内部组装)。

仅使用 8 元素数组即可进一步改进内存分配,因为 4 元素零数组只是 8 元素零数组的前半部分。

于 2010-10-28T16:29:17.247 回答
0

不,您可以将数组与 进行比较memcmp,但不能将一个值与一块内存进行比较。

您可以做的是在 C++ 中使用算法,但这仍然涉及内部循环。

于 2010-10-28T15:49:14.130 回答
0

您不必遍历整个事物,只需停止循环第一个非零值即可。

除了依次检查它们之外,我想不出任何方法来检查一组值 - 你可以通过检查底层内存来玩游戏,因为它大于bool__int64比如说)但是对齐是一个问题。

编辑:您可以保留单独的设置位计数,并检查它是否非零。你必须小心维护这个,所以设置一个位没有++它等等。

于 2010-10-28T15:49:59.033 回答
0

针织,

我不认为您可以访问目标计算机上的一些花哨的 DMA 硬件?有时 DMA 硬件完全支持您需要的操作,即“此内存区域是否全为零?” 在处理大型位缓冲区时,这种硬件加速比较是一种常见的解决方案。例如,一些 RAID 控制器使用这种机制进行奇偶校验。

于 2010-10-28T19:04:33.793 回答