std :: bitset :: all替代以前的C++ 11编译器

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编译器的替代是否比上面显示的更准确.

Rap*_*ptz 7

只需检查是否count等于size:

template<size_t N>
bool all_set(const std::bitset<N>& b) {
    return b.count() == b.size();
}
Run Code Online (Sandbox Code Playgroud)


lee*_*mes 5

如果你想避免一个循环,但不关心最大的成效,请您可以比较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)

缺点(但与其他非循环解决方案相同,以及使用循环实现)是它不会在未设置的第一位提前停止.如果你想利用它,修改你的循环以提前退出(顺便说一下,你不需要szN):

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)