bitset :: operator [] == false / true或bitset :: test?

时间:2011-08-20 03:40:24

标签: c++ bitset

使用bitset :: operator []等效于使用bitset :: test还是有一些底层优化?

也就是说,这两个循环是等价的吗?

使用bitset :: operator []:

static const int UP = 0;
static const int DOWN = 1;

for(int i = 1; i < KEY_MAX; ++i) {
    if(_handler && (_prevKey[i] == UP && _curKey[i] == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyDownEvent(i));
    }
    if(_handler && (_prevKey[i] == DOWN && _curKey[i] == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyPressEvent(i));
    }
    if(_handler && (_prevKey[i] == DOWN && _curKey[i] == UP)) {
        _handler->EnqueueEvent(new KeyboardKeyUpEvent(i));
    }
}

使用bitset :: test():

static const bool UP = false;
static const bool  DOWN = true;

for(int i = 1; i < KEY_MAX; ++i) {
    if(_handler && (_prevKey.test(i) == UP && _curKey.test(i) == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyDownEvent(i));
    }
    if(_handler && (_prevKey.test(i) == DOWN && _curKey.test(i) == DOWN)) {
        _handler->EnqueueEvent(new KeyboardKeyPressEvent(i));
    }
    if(_handler && (_prevKey.test(i) == DOWN && _curKey.test(i) == UP)) {
        _handler->EnqueueEvent(new KeyboardKeyUpEvent(i));
    }
}

3 个答案:

答案 0 :(得分:3)

从C ++ 03标准,§23.3.5.2/ 39-41:

bool test(size_t pos) const;
     

要求: pos有效   如果out_of_range与有效位位置不对应,则抛出 pos
  如果true中位置pos的位值为1,则返回 *this

§23.3.5.2/ 46-48:

bool operator[](size_t pos) const;
     

要求: pos有效   抛出:什么都没有   退货: test(pos)

§23.3.5.2/ 49-51:

bitset<N>::reference operator[](size_t pos);
     

要求: pos有效   抛出:什么都没有   返回bitset<N>::reference类型的对象,(*this)[pos] == this- test(pos)(*this)[pos] = val等同于this->set(pos, val)

因此,当对象为const时,它们会返回相同的值,但pos无效时test抛出out_of_range,而operator[]则不会抛出任何内容。当对象 const时,操作符返回一个代理对象,允许用户改变对象的数据。

答案 1 :(得分:0)

与访问运算符([])不同,测试函数在检索位值之前对位置执行范围检查。如果该位置不是有效位,则抛出out_of_range。

您可以在以下网址找到参考资料:

http://www.cplusplus.com/reference/stl/bitset

答案 2 :(得分:0)

我会这样优化:

int nPrevKey, nCurKey;

for(int i = 1; i < KEY_MAX; ++i) 
{
    if(_handler)
    {
        nPrevKey = _prevKey[i];
        nCurKey = _curKey[i];

        if(nPrevKey == UP && nCurKey  == DOWN)
        {
            _handler->EnqueueEvent(new KeyboardKeyDownEvent(i));
        }
        if(nPrevKey  == DOWN && nCurKey  == DOWN)
        {
            _handler->EnqueueEvent(new KeyboardKeyPressEvent(i));
        }
        if(nPrevKey  == DOWN && nCurKey  == UP)
        {
            _handler->EnqueueEvent(new KeyboardKeyUpEvent(i));
        }
    }
}

与其他实施类似。