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

时间:2014-11-13 13:34:06

标签: 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;
}

问:

对于过时的C ++ 11编译器,是否有更恰当的std::bitset::all替代实现,而不是上面显示的编译器。

5 个答案:

答案 0 :(得分:7)

只需检查count是否等于size

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

答案 1 :(得分:5)

如果您想避免循环,但不关心最大性能,可以将countsize进行比较(即检查设置的位数是否等于位数) ):

template<std::size_t N>
bool all(std::bitset<N> const &bs) {
    return bs.count() == bs.size();
}

缺点(但与其他非循环解决方案相同,以及您使用循环实现)是它不会在第一位未设置的情况下提前停止。如果您想利用它,请修改您的循环以提前退出(顺便说一句,您不需要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;
}

答案 2 :(得分:2)

愚蠢的方式是

(~bs).none();

(愚蠢因为operator~返回一个临时的。)

答案 3 :(得分:2)

您可以使用bs.count() == bs.size()

答案 4 :(得分:1)

另一种方法是使用模板元编程并展开位域的位,如下例所示:

template<std::size_t N, int M>
struct bitset_all_helper {
  static bool check(std::bitset<N> const &bs) { return bs[M] && bitset_all_helper<N, M - 1>::check(bs); }
};

template<std::size_t N>
struct bitset_all_helper<N, 0> {
  static bool check(std::bitset<N> const &bs) { return bs[0]; }
};

template<std::size_t N>
bool bitset_all(std::bitset<N> const &bs) { return bitset_all_helper<N, N - 1>::check(bs); }

LIVE DEMO