bitset::operator[] == false/true or bitset::test?
bitset::operator[] == false/true or bitset::test?
使用bitset::operator[]等同于使用bitset::test还是有一些底层优化?
也就是说,这两个循环是否等价?
使用bitset::运营商[]:
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 ::测试():
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
不对应有效的位位置。
返回: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_range
,而operator[]
什么也不抛出。当对象不是 const
时,操作符返回一个代理对象,允许修改对象的数据。
与访问操作符([])不同,test函数在检索位值之前对位置进行范围检查。如果位置不是有效的位位置,则抛出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));
}
}
}
和其他类似的实现。
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 如何打印大于"无符号长长"的"std::bitset"的十进制值?
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 我如何将 OR 与 if 语句一起使用字符串
- 将 if 语句中的字符与 or 进行比较
- 关于 std::bitset 构造函数的几个问题?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 如何以滑动窗口方式从 std::bitset 读取位并将它们转换为 int?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- "No such file or directory" C++标头问题
- 处理 std::enable_if<...中谓词的逻辑"OR">
- C++ 虽然语句不适用于字符串和"or"
- bitset::operator[] == false/true or bitset::test?