检查所有数组成员是否具有相同的值
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时进行加法/减法运算。则CCD_ 1或CCD_。
编辑:应该添加您需要的检查,这样您就不会在bool已经关闭时进行减法运算,也不会在它已经打开时进行加法运算。
除非在构建集合时存储并更新了元数据,否则这将需要迭代数组,因此所有解决方案都是O(N)。
然而,使用单指令多数据体系结构(如英特尔上的SSE、ARM上的Neon)进行矢量化可能会显著减少循环迭代次数。如果你的数据是对齐的,并且是SIMD步幅的倍数,这将是最好的,否则你需要处理最终效果。有些编译器甚至可以自动执行此操作。
另一件需要考虑的事情是提前退出。例如,另一个答案中提到的count_of
函数将始终迭代整个数组,即使前两个元素不同。因此,与显式迭代的天真方法相比,这是一种去优化。
您可以在适当的条件下使用all_of
。
或者,count
、count_if
、find_if
、any_of
、none_of
也可以用于此目的。if ctr == numOfBools
0变体不会提前退出,因此将始终在整个数组上迭代。
如果你不想使用基于迭代的方法,我可以想出两种相当棘手的方法。
- 跟踪插入-计数
num_true
,每次进行插入或设置时都会对其进行修改。稍后,这可以用于验证您的状况 - 如果它是一个纯数组,你可以做一些
memcmp
的东西来与一个全真数组进行比较,看看它是否相同。这可能会稍微快一点
也许有一个函数可以自动执行。
但是无论如何,你必须测试数组的每个成员,所以它不能比迭代解决方案快
您必须使用循环来迭代所有对象并检查它们。
您可能能够通过循环优化来提高性能。
除此之外,如果数据存在于容器中(没有指针),并且体系结构允许,则可以使用SSE矢量化来提高总体性能
您可以通过封装对数组的访问来缓存数组状态,并记录有多少条目设置为true。
将数组初始化为false时,将计数器设置为0。每次条目从false变为true时,递增计数器,当条目从true变为false时,递减计数器。
现在,您可以通过一次测试来检查数组是否全部为真、全部为假或混合。
- 如何找到大小'x'数组是否完全填充,在C++?
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 是否基于数组B整数打印数组A中的整数
- 检查TCHAR数组输入是否为带符号整数C++
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 是否假定reinterpret_cast<char*>(myTypePtr)指向数组?
- 如果分配数组引发异常,是否应该释放该数组
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 我是否不正确地集中了这些字符数组?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 将对象的字节复制到数组并再次复制回来是否安全
- 是否可以将结构数组别名为结构成员数组?
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?