当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() 等方法也能提高一定的效率。