繁体   English   中英

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

[英]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 == numOfBoolsctr == 0它们都是相同的。

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

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

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

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

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

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

如果你不想基于迭代的方法我可以想到两个相当hacky的方法。

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

也许有一个功能可以自动完成。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM