[英]Check if all the array members have the same value
是否有STL算法或快速技术来测试数组的所有成员是否设置为相同的值?
例如,我有一个默认值的数组:
bool *finishFlags =new (std::nothrow) bool[numOfBools];
//Init all to false:
for(int i = 0 ; i < numOfBools; ++i){
*finishFlags++ = false;
}
现在,在运行时期间,一些数组成员被设置为true,我想测试它们是否都被设置为相同的值(在这种情况下为true)。是否有一种快速的方法可以在没有典型的数组迭代的情况下完成它?
保持计数器并加上/减去标志翻转为true或false。 然后, if ctr == numOfBools
或ctr == 0
它们都是相同的。
编辑:应该添加您需要检查,这样您就不会减去bool是否已经关闭,或者如果已经打开则添加。
除非您在构建集合时存储和更新元数据,否则这将需要迭代阵列,因此所有解决方案都将为O(N)。
但是,可以使用单指令多数据架构(例如Intel上的SSE,ARM上的Neon)进行矢量化,从而大幅减少循环迭代次数。 如果您的数据是对齐的并且是SIMD的倍数,那么这将最有效,否则您将需要处理最终效果。 有些编译器甚至可以自动执行此操作。
另一件需要考虑的事情是早退。 例如,另一个答案中提到的count_of
函数将始终迭代整个数组,即使前两个元素不同。 与使用显式迭代的朴素方法相比,这是一种去优化。
也许有一个功能可以自动完成。
但无论如何你必须测试数组的每个成员,因此它不能比迭代解决方案更快
您可以通过封装对数组的访问来缓存数组状态,并记录有多少条目设置为true。
在将数组初始化为false时,将计数器设置为0.每次条目从false更改为true时,递增计数器,当条目从true变为false时,递减计数器。
现在,您可以通过单个测试检查数组是否全部为真,全部为假或混合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.