簡體   English   中英

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

[英]bitset::operator[] == false/true or bitset::test?

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

根據C ++ 03標准,§23.3.5.2/ 39-41:

 bool test(size_t pos) const; 

要求: pos有效
拋出: out_of_range如果pos不對應於有效位位置)。
返回:如果*this pos位置的位的值為1,則返回 true

§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 ,操作員將返回一個代理對象,該對象允許對對象的數據進行突變。

與訪問運算符([])不同,測試功能在檢索位值之前對位置進行范圍檢查。 如果該位置不是有效的位位置,則拋出out_of_range。

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

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

我將以這種方式對其進行優化:

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

與其他實施類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM