我知道在C ++中,有几种方法可以实现标志,例如std::bitset<>bool和使用uint8_t这样的整数类型。但是当执行时间或内存受到限制时,在C ++中实现标志的首选方法是什么,例如for(;;) vs while(1)
我认为使用boolcharstd::bitset<>快,因为std::bitset不是基本数据类型。

std::bitset<2> flag;
flag.reset(0);
flag.set(1);
if(flag.test(0)){...}
if(!flag.test(1)){...}
//------------------------
bool flag0 = 0;
bool flag1 = 1;
if(flag0){...}
if(!flag1){...}
//------------------------
uint8_t flag = 0b00000010;
if(flag & 0x01){...}
if(!flag & 0x02){...}


在处理uint8_t中的标志时,或者在程序执行期间反复使用它们(如玩家的状态效果)时,我会亲自使用struct;对于短期标志,例如在进行气泡排序时,会重复使用bool
还有其他更有效或更优选的方法来实现标志吗?

最佳答案

在我的项目中,当我在课堂上有很多布尔值时,我会像这样打包它们。

class A {
    //...

    struct {   //note: unnamed struct
        bool bCondA : 1;
        bool bCondB : 1;
        bool bCondC : 1;
        //... and so on...

    };
    //...
};


void funcA(){

    A objA;
    if(A.bCondB){
        //...
    }
    else if (A.bCondC){
        //...
    }

}


您可以像在任何代码中的普通bool成员一样照常使用成员标志/布尔值。编辑将仅在类定义上进行。

如果我想在一个操作中操作多个它们,我可以这样做:

class A {
    //...
    union {   //note: unnamed union
        struct {   //note: unnamed struct
            bool m_bCondA : 1;
            bool m_bCondB : 1;
            bool m_bCondC : 1;
            //... and so on...

        };
        int m_bAllFlags;   //note: you can change int to int8_t or any type that will fit all the flags.
    };

    void methodX(); //method for testing.
    void clearFlags(){ m_bAllFlags = 0; } //clear all flags in 1 swoop.
    void clearGroup1Flags(){ m_bAllFlags & ~0b0110101101; }
    //...
};


void A::methodX(){

    A objA;

    objA.m_bCondC = true;

    if(objA.m_bCondA){
        //...
    }
    else if (objA.m_bCondA){
        //...
    }

    objA.clearFlags();

}


我不知道优点和缺点的全部清单,但是对我来说很好。

09-10 04:55
查看更多