我有一个类Item,其中包含另一个类SubItem的向量。 SubItem类有一个存储subItem状态的位数组。子项类的每个状态都是独立于其他状态和其他子项设置/重置的。在事件驱动的环境中设置/重置状态。
我想在Item类中创建一个状态,它依赖于subItem状态的OR运算,即如果任何子项的状态,例如State1 = 1则是Item' s state1 = 1,如果所有子项state1 = 0,则item" state1 = 0。
复杂的是,Item类中的子项向量大小可能很大,我不希望循环遍历所有SubItems以在子项的状态发生变化时设置Item的状态。
一个选项是我在Item中创建一个int数组并保持一个给定状态设置为1的腿的数量,并且每当计数为0时我知道所有subItem的state1都设置为0所以我可以将Item的state1也设置为0.但是这不是空间效率。
我有另一个解决方案,但不知道如何在不循环子项的情况下执行此操作。 解决方案是Item也有一个bitarray。因此,为了确定ITem的state1 = 1,我得到所有分支的state1并且使用const unsigned int = 0(00000000)执行OR,如果此OR运算的结果为非零,那么我知道项目&# 39; s state1也是1,当结果为0时,item的state1也是0,但是我只是不知道如何在没有循环遍历所有子项时修改子项的状态。< / p>
//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.*/
}
答案 0 :(得分:0)
一个选项是我在Item中创建一个int数组并保持计数方式 许多腿的给定状态设置为1,每当计数为0时 知道所有subItem的state1都设置为0所以我也可以设置Item的state1 然而,这不是空间效率。
节省空间(每个状态只需要添加一个计数器),但是您必须确保位设置操作只能通过设置该位的功能来完成,并且还可以更改相应的计数器,以保持一切同步。
否则,我看到的唯一其他选项是将计数委托给数据结构,但为此您必须更改位的存储方式。例如,对于每个状态使用两组整数,一组用于bit = 1的项目,另一组用于bit = 0的项目 - 但是使用该特定结构将使用(很多)更多内存并且可能也更慢。
我有另一个解决方案,但不知道如何在不循环子项的情况下执行此操作。解决方案是Item也有一个 bitarray。因此,为了确定ITem的state1 = 1,我获得了所有支路的状态1 如果结果为,则使用const unsigned int = 0(00000000)执行OR 这个OR运算是非零然后我知道项目的state1也是1 当结果为0时,项目的state1也为0,但我不是 知道怎么做而不用循环遍历所有子项目 subitem的状态被修改。
我不知道如何解决问题(x OR 0
是alxays x
,那么重点是什么?)。
PS并且在花费任何时间使代码更复杂之前,您应该对流程进行分析,以查看向量中的计数是否实际上是一个问题。它可能只占总处理时间的0.1%。