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

Check if all the array members have the same value

本文关键字:是否 数组 组成员 检查      更新时间:2023-10-16

是否有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时进行加法/减法运算。则CCD_ 1或CCD_。

编辑:应该添加您需要的检查,这样您就不会在bool已经关闭时进行减法运算,也不会在它已经打开时进行加法运算。

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

然而,使用单指令多数据体系结构(如英特尔上的SSE、ARM上的Neon)进行矢量化可能会显著减少循环迭代次数。如果你的数据是对齐的,并且是SIMD步幅的倍数,这将是最好的,否则你需要处理最终效果。有些编译器甚至可以自动执行此操作。

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

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

或者,countcount_iffind_ifany_ofnone_of也可以用于此目的。if ctr == numOfBools0变体不会提前退出,因此将始终在整个数组上迭代。

如果你不想使用基于迭代的方法,我可以想出两种相当棘手的方法。

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

也许有一个函数可以自动执行。

但是无论如何,你必须测试数组的每个成员,所以它不能比迭代解决方案快

您必须使用循环来迭代所有对象并检查它们。

您可能能够通过循环优化来提高性能。

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

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

将数组初始化为false时,将计数器设置为0。每次条目从false变为true时,递增计数器,当条目从true变为false时,递减计数器。

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