使用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));
}
}
答案 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。
您可以在以下网址找到参考资料:
答案 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));
}
}
}
与其他实施类似。