找出向量中所有元素是否为假或真c ++的最快方法?

时间:2014-11-12 20:31:32

标签: c++ vector

我想知道是否有一种快速方法可以确定向量中的所有元素是 false 还是 true ?喜欢而不是使用循环检查每个元素?

6 个答案:

答案 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;
}

如果alltrue,则向量中的所有元素均为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的某些标识符(以及一种检查谓词是否相等的方法)。

然后我可以应用以上方案。