检查所有数组成员是否具有相同的值

时间:2013-08-25 14:04:51

标签: c++ algorithm

是否有STL算法或快速技术来测试数组的所有成员是否都设置为相同的值?

例如,我有一个默认值的数组:

bool *finishFlags  =new (std::nothrow) bool[numOfBools];

    //Init all to false:

for(int i = 0 ; i < numOfBools; ++i){
   *finishFlags++ = false;
}

现在,在运行时期间,一些数组成员被设置为true,我想测试它们是否都设置为相同的值(在这种情况下为true)。有没有典型数组的快速方法迭代?

6 个答案:

答案 0 :(得分:7)

保持计数器并加上/减去标志翻转为true或false。然后if ctr == numOfBoolsctr == 0他们都是一样的。

编辑:应该已经添加了你需要检查的内容,这样就不会减去bool是否已经关闭或者如果已经开启则添加。

答案 1 :(得分:3)

除非您在构建集合时存储和更新元数据,否则这将需要迭代数组,因此所有解决方案都将为O(N)。

但是,可以使用单指令多数据架构(例如Intel上的SSE,ARM上的Neon)进行矢量化,从而大幅减少循环迭代次数。如果您的数据是对齐的并且是SIMD的倍数,那么这将最有效,否则您将需要处理最终效果。有些编译器甚至可以自动执行此操作。

另一件需要考虑的事情是早退。例如,另一个答案中提到的count_of函数将始终迭代整个数组,即使前两个元素不同。与使用显式迭代的朴素方法相比,这是一种去优化。

答案 2 :(得分:2)

您可以在适当的条件下使用all_of

或者,countcount_iffind_ifany_ofnone_of也可用于此目的。 count变体不会提前退出,因此将始终遍历整个数组。

如果你不想基于迭代的方法,我可以想到两种相当笨拙的方法。

  1. 跟踪插入 - 每次进行插入或设置时修改的计数num_true。之后,这可用于验证您的状况。
  2. 如果它是一个纯数组,你可以做一些memcmp的东西来与全真数组进行比较,看它是否相同。这可能会略微加快。

答案 3 :(得分:1)

也许有一个函数可以自动完成。但是无论如何你必须测试数组的每个成员,所以它不能比迭代解决方案更快

答案 4 :(得分:1)

你必须使用一个循环迭代所有对象并检查它们。

您可以通过循环 optimizations 来提高效果。

除此之外,如果数据存在于容器内(没有指针),并且架构允许,您可以使用 SSE 矢量化来提高整体性能

答案 5 :(得分:0)

您可以通过封装对数组的访问来缓存数组状态,并记录有多少条目设置为true。

在将数组初始化为false时,将计数器设置为0.每次条目从fal​​se更改为true时,递增计数器,当条目从true变为false时,递减计数器。

现在,您可以通过单个测试检查数组是否全部为真,全部为假或混合。