C++ 对象向量上所有位数组成员的OR操作
我有一个类项和另一个类子项的向量。 子项类有一个存储子项状态的位数组。子项类的每个状态的设置/重置独立于其他状态和其他子项。在事件驱动环境中设置/重置状态 我想在Item类中创建一个状态,该状态也依赖于子项状态的OR操作,即如果子项的任何状态,例如State1=1,则Item的State1=1;如果所有子项State1=0,则Item的State1=0 复杂的是,Item类中的子项向量大小可能很大,我不想在子项的状态发生变化时遍历所有子项来设置项的状态C++ 对象向量上所有位数组成员的OR操作,c++,arrays,bitmap,bit-manipulation,bitwise-operators,C++,Arrays,Bitmap,Bit Manipulation,Bitwise Operators,我有一个类项和另一个类子项的向量。 子项类有一个存储子项状态的位数组。子项类的每个状态的设置/重置独立于其他状态和其他子项。在事件驱动环境中设置/重置状态 我想在Item类中创建一个状态,该状态也依赖于子项状态的OR操作,即如果子项的任何状态,例如State1=1,则Item的State1=1;如果所有子项State1=0,则Item的State1=0 复杂的是,Item类中的子项向量大小可能很大,我不想在子项的状态发生变化时遍历所有子项来设置项的状态 一个选项是我在Item中创建一个int数组
一个选项是我在Item中创建一个int数组,并将给定状态的腿数设置为1,每当计数为0时,我知道所有子项的state1都设置为0,这样我就可以将Item的state1也设置为0。然而,这并不节省空间 我想到了另一个解决方案,但不知道如何在不循环子项的情况下做到这一点。 解决方案是该项还具有位数组。因此,为了确定项的state1是否为1,我获取所有分支的state1,并使用const unsigned int=0(00000000)执行OR如果此OR操作的结果为非零,则我知道项的state1也为1,当结果为0时,则项的state1也为0,但我不知道如何在修改子项的状态时不循环所有子项
//this enum refers to subitem's and item's states
enum class flags
{
state1, state2, state3, state4
}
class SubItem
{
//The bitarray that stores states of subItem
unsigned int bitarray;
}
Class Item
{
std:vector<SubItem> m_arrSubItems;
Item(size_t size)
{
m_arrSubItems.Reserve(size)
}
/*The Item wants to create an array of states here.Each index of this array is an OR operation of the same state across all SubItems.*/
}
//此枚举引用子项和项的状态
枚举类标志
{
状态1,状态2,状态3,状态4
}
类别子项
{
//存储子项状态的位数组
无符号整数位数组;
}
类项目
{
std:向量m_子项;
项目(尺寸)
{
m_Arrr子项保留(大小)
}
/*该项要在此处创建状态数组。该数组的每个索引都是所有子项中相同状态的OR操作*/
}
一个选项是我在Item中创建一个int数组,并记录如何创建
许多支腿的给定状态设置为1,每当计数为0时,I
知道所有子项的state1都设置为0,因此我也可以设置项的state1
到0。然而,这并不节省空间 它节省空间(每个状态只需添加一个计数器),但您必须确保位设置操作只能通过设置位并更改相应计数器的函数来完成,以保持一切同步 否则,我看到的唯一其他选项是将计数委托给数据结构,但为此,您必须更改位的存储方式。例如,对每个状态使用两组整数,一组用于位=1的项,另一组用于位=0的项,但使用该特定结构将使用(大量)更多内存,可能也会更慢 我想到了另一个解决方案,但不知道如何在不循环子项的情况下做到这一点。解决方案是,该项还具有 位数组。因此,为了确定项的state1=1,我得到所有分支的state1 如果 这个OR操作是非零的,那么我知道项的state1也是1 当结果为0时,则项的状态1也为0,但我不这样做 知道如何在不循环所有子项的情况下,在 子项的状态已修改
//this enum refers to subitem's and item's states
enum class flags
{
state1, state2, state3, state4
}
class SubItem
{
//The bitarray that stores states of subItem
unsigned int bitarray;
}
Class Item
{
std:vector<SubItem> m_arrSubItems;
Item(size_t size)
{
m_arrSubItems.Reserve(size)
}
/*The Item wants to create an array of states here.Each index of this array is an OR operation of the same state across all SubItems.*/
}
我看不出这是如何解决问题的(而且x或0
总是x
,那有什么意义呢?)
在花时间使代码变得更复杂之前,您应该分析您的过程,看看向量的计数是否真的是一个问题。它可能只占用总处理时间的0.1%。“但是这不节省空间。”=>每个状态只有一个int?大约有30个状态,但是开发人员在切换子项的状态时很容易忘记更新项的状态计数。如果我找不到其他更好的选项,我可能会选择这个计数选项。这个选项的问题不是空间,而是代码维护。你确定你首先遇到了问题,即循环是否会导致可测量的性能问题?是的。我们说的是每秒数百次,它是在一个线程上对一长串项目的批处理。好的,但是你真的在最坏的情况下测量过吗?注意:一般来说,你并没有遍历所有的子项,一旦你发现了两个不同的状态,你就会停止。