是否有STL算法或快速技术来测试数组的所有成员是否都设置为相同的值?
例如,我有一个默认值的数组:
bool *finishFlags =new (std::nothrow) bool[numOfBools];
//Init all to false:
for(int i = 0 ; i < numOfBools; ++i){
*finishFlags++ = false;
}
现在,在运行时期间,一些数组成员被设置为true,我想测试它们是否都设置为相同的值(在这种情况下为true)。有没有典型数组的快速方法迭代?
答案 0 :(得分:7)
保持计数器并加上/减去标志翻转为true或false。然后if ctr == numOfBools
或ctr == 0
他们都是一样的。
编辑:应该已经添加了你需要检查的内容,这样就不会减去bool是否已经关闭或者如果已经开启则添加。
答案 1 :(得分:3)
除非您在构建集合时存储和更新元数据,否则这将需要迭代数组,因此所有解决方案都将为O(N)。
但是,可以使用单指令多数据架构(例如Intel上的SSE,ARM上的Neon)进行矢量化,从而大幅减少循环迭代次数。如果您的数据是对齐的并且是SIMD的倍数,那么这将最有效,否则您将需要处理最终效果。有些编译器甚至可以自动执行此操作。
另一件需要考虑的事情是早退。例如,另一个答案中提到的count_of
函数将始终迭代整个数组,即使前两个元素不同。与使用显式迭代的朴素方法相比,这是一种去优化。
答案 2 :(得分:2)
您可以在适当的条件下使用all_of
。
或者,count
,count_if
,find_if
,any_of
,none_of
也可用于此目的。 count
变体不会提前退出,因此将始终遍历整个数组。
如果你不想基于迭代的方法,我可以想到两种相当笨拙的方法。
num_true
。之后,这可用于验证您的状况。memcmp
的东西来与全真数组进行比较,看它是否相同。这可能会略微加快。答案 3 :(得分:1)
也许有一个函数可以自动完成。但是无论如何你必须测试数组的每个成员,所以它不能比迭代解决方案更快
答案 4 :(得分:1)
你必须使用一个循环迭代所有对象并检查它们。
您可以通过循环 optimizations 来提高效果。
除此之外,如果数据存在于容器内(没有指针),并且架构允许,您可以使用 SSE 矢量化来提高整体性能
答案 5 :(得分:0)
您可以通过封装对数组的访问来缓存数组状态,并记录有多少条目设置为true。
在将数组初始化为false时,将计数器设置为0.每次条目从false更改为true时,递增计数器,当条目从true变为false时,递减计数器。
现在,您可以通过单个测试检查数组是否全部为真,全部为假或混合。