2011-08-20 73 views
1

使用bitset :: operator []等价于使用bitset :: test还是存在一些基础优化?bitset :: operator [] == false/true或bitset :: test?

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

使用位集::操作符[]:

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)); 
    } 
} 

使用位集::测试():

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

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

bool test(size_t pos) const; 

要求:pos有效
抛出:out_of_range如果pos不对应于有效位的位置。
返回:true如果位于*this的位置pos的位值为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时,运算符返回一个代理对象,允许对象更改对象的数据。

0

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

你可以找到参考资料:

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

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)); 
     } 
    } 
} 

并且类似地,其他实现。