6

我想使用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;
}

问:

是否有std::bitset::all比上面显示的更合适的替代旧 C++11 编译器的实现。

4

5 回答 5

7

只需检查是否count等于size

template<size_t N>
bool all_set(const std::bitset<N>& b) {
    return b.count() == b.size();
}
于 2014-11-13T13:38:16.813 回答
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;
}
于 2014-11-13T13:41:44.427 回答
2

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

于 2014-11-13T13:41:52.463 回答
2

一个愚蠢的方法是

(~bs).none();

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

于 2014-11-13T13:41:22.760 回答
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); }

现场演示

于 2014-11-13T14:03:54.107 回答