1

使用 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));
    }
}
4

3 回答 3

3

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

bool test(size_t pos) const;

要求: pos有效
抛出: out_of_range如果pos不对应于有效位位置。
返回: true如果位置posin的位*this具有值 1。

§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_rangeoperator[]什么都不抛出。当对象不是 const时,操作符返回一个代理对象,允许改变对象的数据。

于 2011-08-20T03:45:13.280 回答
0

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

您可以在以下位置找到参考:

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

于 2011-08-20T03:47:27.347 回答
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));
        }
    }
}

和类似的其他实现。

于 2011-08-20T11:29:08.863 回答