我想知道是否有一种快速方法可以确定向量中的所有元素是 false 还是 true ?喜欢而不是使用循环检查每个元素?
答案 0 :(得分:14)
为了清晰起见,我会利用新算法:
// all true
std::all_of(vec.begin(), vec.end(), [](bool v) { return v; });
// all false
std::all_of(vec.begin(), vec.end(), [](bool v) { return !v; });
std::none_of(vec.begin(), vec.end(), [](bool v) { return v; });
如果没有实际检查向量的每个元素,就无法确定向量中的所有元素是否都为真。最好的情况是,您以不同方式重新解释内存并一次检查多个元素,但是在找到未通过测试的内容之前,您仍需检查所有内容。
答案 1 :(得分:3)
最简单的IMO是免费的find
功能
if (std::find(begin(v), end(v), true) == end(v)) // All false
答案 2 :(得分:1)
这需要循环,但至少会利用短路行为。
bool all = true;
std::vector<bool>::iterator it = myVec.begin();
while(all && it != myVec.end()) // Stops early if it hits a false
{
all &= *it;
++it;
}
如果all
为true
,则向量中的所有元素均为true。如果all
为false,则至少有一个元素不是true
。
答案 3 :(得分:1)
您还可以使用std::accumulate()
:
int sum = std::accumulate(std::begin(v), std::end(v), 0);
if (sum == v.size()) {
// All true
}
else if (sum) {
// Any true, any false
}
else {
// All false
}
答案 4 :(得分:1)
我认为效率最高的是:
if(v.find(v.begin(), v.end(), true) == v.end())
// All false
if(v.find(v.begin(), v.end(), false) == v.end())
// All true
答案 5 :(得分:1)
我也同意,最坏的情况是必须检查每个单独的元素,但对于所有其他情况,我建议改写这个问题:
集合中的所有元素都相等吗?如果是这样,什么值。
在两种情况下都将尽早返回,您已完成。 另外,还需要检查元素的值(对还是错)。
为此,我建议您看看here。
我想进一步概括一下我的答案:可以使用要检查集合的任何N个互斥谓词A1,...,AN来完成。为此,我需要一个函数,给定集合中的一个元素,该函数返回该元素所包含的谓词Ai的某些标识符(以及一种检查谓词是否相等的方法)。
然后我可以应用以上方案。