101*_*010 6 c++ c++03 std-bitset
我想使用std::bitset::all但不幸的是我的编译器是早期的C++ 11.我知道我可以通过检查循环中是否设置了所有位来模仿功能std::bitset.
例如,
template<std::size_t N>
bool
all(std::bitset<N> const &bs) {
int hits(0), sz(bs.size());
for(int i(0); i < sz; ++i) {
hits += bs[i];
}
return hits == sz;
}
Run Code Online (Sandbox Code Playgroud)
std::bitset::all对于过时的C++ 11编译器的替代是否比上面显示的更准确.
template<size_t N>
bool all_set(const std::bitset<N>& b) {
return b.count() == b.size();
}
Run Code Online (Sandbox Code Playgroud)
如果你想避免一个循环,但不关心最大的成效,请您可以比较count反对size(即检查是否设置的位数等于位的数量):
template<std::size_t N>
bool all(std::bitset<N> const &bs) {
return bs.count() == bs.size();
}
Run Code Online (Sandbox Code Playgroud)
缺点(但与其他非循环解决方案相同,以及使用循环实现)是它不会在未设置的第一位提前停止.如果你想利用它,修改你的循环以提前退出(顺便说一下,你不需要sz它N):
template<std::size_t N>
bool all(std::bitset<N> const &bs) {
for (int i = 0; i < N; ++i)
if (!bs[i]) return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)