当bitset的长度小于64(8个字节)的时候,没有太大效率问题。但足够长的时候就需要考虑了,事实上,当长度大于64的时候会马上突显出来这个问题。
bitset虽然能用位运算,但是当长度较长时把位运算的思想拿过来,还是会有效率问题的。下面代码测试读写的效率,可以根据输出结果判断哪个效率更高。
写:
// Example program
#include <iostream>
#include <bitset>
#include <ctime>
#include <vector>
int main()
{
static const int BITS = 4096;
static const std::bitset<BITS> b(1);
clock_t t1 = clock();
std::bitset<BITS> a;
for(int i = 0;i<1000000;i++)
{
a[i%BITS] = 1;
}
std::cout << clock() - t1 << std::endl;
clock_t t2 = clock();
std::bitset<BITS> a2;
for(int i = 0;i<1000000;i++)
{
a2 = b<<(i%BITS);
}
std::cout << clock() - t2 << std::endl;
clock_t t3 = clock();
std::bitset<BITS> a3;
for(int i = 0;i<1000000;i++)
{
a3.set(i%BITS, 1);
}
std::cout << clock() - t3 << std::endl;
return 0;
}
输出:
1252 100910 0
读:
// Example program
#include <iostream>
#include <bitset>
#include <ctime>
#include <vector>
int main()
{
static const int BITS = 4096;
static const std::bitset<BITS> b(1);
bool t = false;
clock_t t1 = clock();
std::bitset<BITS> a;
for(int i = 0;i<1000000;i++)
{
t = a[i%BITS];
}
std::cout << clock() - t1 << std::endl;
clock_t t2 = clock();
std::bitset<BITS> a2;
for(int i = 0;i<1000000;i++)
{
auto p = b<<(i%BITS);
t = (a2 & p) == p;
}
std::cout << clock() - t2 << std::endl;
clock_t t3 = clock();
std::bitset<BITS> a3;
for(int i = 0;i<1000000;i++)
{
t = a3.test(i%BITS);
}
std::cout << clock() - t3 << std::endl;
return 0;
}
输出:
1 106836 1
另外,all(), none(), any() 等方法也能提高一定的效率。