我是否可以检查C(++)数组是否全为0(或为false)而不对每个值进行迭代/循环并且不分配相同大小的新数组(使用memcmp
)?
我正在滥用一系列bool来在运行时拥有任意大的位集并对其进行一些翻转
答案 0 :(得分:4)
您可以使用以下条件:
(myvector.end() == std::find(myvector.begin(), myvector.end(), true))
显然,在内部,这会循环所有值。
替代方案(实际上应该避免循环)是覆盖所有写访问函数,并跟踪是否已将true
写入向量。
<强>更新强>
Lie Ryan在下面的评论描述了一种更强大的方法,基于相同的原则。
答案 1 :(得分:2)
如果没有排序,没有。你打算如何实现这一目标?您需要检查每个元素以查看它是否为0!当然,memcmp也会检查每个元素。它会更加昂贵,因为它也会读取另一个数组。
当然,只要你遇到一个非0元素,你就可以提前退出。
你唯一的选择是使用SIMD(技术上仍然检查每个元素,但使用较少的指令),但你通常不会在通用数组中这样做。
(顺便说一句,我的回答是假设您有一个简单的静态C / C ++数组。如果您可以指定您拥有的数组类型,我们可能会更具体。)
答案 2 :(得分:1)
如果您知道这将是一项要求,您可以构建一个由数组(可能是动态的)和计数或当前非零单元组成的数据结构。显然,必须通过抽象来设置单元格,但这在c ++中具有重载是很自然的,并且您可以在c中使用opaque类型。
答案 3 :(得分:1)
请考虑使用boost::dynamic_bitset
。它有一个none
成员和几个其他类似std::bitset
的操作,但它的长度可以在运行时设置。
答案 4 :(得分:1)
假设你有一个N元素数组,你可以对一组基矢量进行一些检查。
例如,您有一个要测试的15个元素的数组。
您可以针对8元素零数组,4元素零数组,2元素零数组和1元素零数组进行测试。
只要您知道要测试的数组的最大大小,就必须分配这些元素。此外,测试可以并行完成(如果需要,可以使用内部装配)。
内存分配方面的进一步改进只能使用8个元素的数组,因为4个元素的零数组只是8个元素零数组的前半部分。
答案 5 :(得分:0)
不,您可以将数组与memcmp
进行比较,但无法将一个值与一块内存进行比较。
你能做的就是在C ++中使用算法,但内部仍然需要一个循环。
答案 6 :(得分:0)
您不必迭代整个事物,只需停止循环第一个非零值。
我想不出任何方法来检查一组值,而不是依次检查它们 - 你可以玩游戏,检查底层内存是否大于bool
(__int64
说但是,协调是一个问题。
编辑:
您可以保留单独的设置位数,并检查是否为非零。你必须小心维护它,所以设置一个设置位不是++
等等。
答案 7 :(得分:0)
knittl,
我不认为您可以访问目标计算机上的某些奇特的DMA硬件?有时,DMA硬件完全支持您需要的操作,即“此内存区域是否全为零?”在处理大型缓冲区时,这种硬件加速比较是一种常见的解决方案。例如,某些RAID控制器使用此机制进行奇偶校验。