我想使用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
替代实现,而不是上面显示的编译器。
答案 0 :(得分:7)
template<size_t N>
bool all_set(const std::bitset<N>& b) {
return b.count() == b.size();
}
答案 1 :(得分:5)
如果您想避免循环,但不关心最大性能,可以将count
与size
进行比较(即检查设置的位数是否等于位数) ):
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); }