bitset :: operator [] == false / true или bitset :: test? - PullRequest
1 голос
/ 20 августа 2011

Использование 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 ]

3 голосов
/ 20 августа 2011

Из стандарта C ++ 03, §23.3.5.2 / 39-41:

bool test(size_t pos) const;

Требуется: pos действительно
Броски: out_of_range, если pos не соответствует действительной битовой позиции.
Возвращает: true, если бит в позиции pos в *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, оператор возвращает прокси-объект, позволяющий изменить данные объекта.

0 голосов
/ 20 августа 2011

Я бы оптимизировал это так:

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

И аналогично другой реализации.

0 голосов
/ 20 августа 2011

В отличие от оператора доступа ([]), функция проверки выполняет проверку диапазона позиции перед получением значения бита.out_of_range генерируется, если позиция не является правильной битовой позицией.

Вы можете найти ссылки на:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...