C++ 找出向量中所有元素是假是真的最快方法c++;?
我想知道是否有一种快速的方法来确定向量中的所有元素是假还是真?与使用循环检查每个元素类似?这需要循环,但至少会利用短循环行为C++ 找出向量中所有元素是假是真的最快方法c++;?,c++,vector,C++,Vector,我想知道是否有一种快速的方法来确定向量中的所有元素是假还是真?与使用循环检查每个元素类似?这需要循环,但至少会利用短循环行为 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; } bool
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;
}
bool all=true;
std::vector::iterator it=myVec.begin();
while(all&&it!=myVec.end())//如果遇到错误,则会提前停止
{
全部&=*它;
++它;
}
如果
all
为true
,则向量中的所有元素均为true。如果all
为false,则至少有一个元素不是true
为了清晰起见,我会利用新算法:
// 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; });
如果不实际检查向量的每个元素,就无法确定向量中的所有元素是否为真。最好的情况是,您以不同的方式重新解释内存,并一次检查多个元素,但您仍然必须检查所有内容,直到找到一个测试失败 您也可以使用
std::accumulate()
:
我认为最有效的方法是:
if(v.find(v.begin(), v.end(), true) == v.end())
// All false
if(v.find(v.begin(), v.end(), false) == v.end())
// All true
最简单的IMO是免费的
find
功能
if (std::find(begin(v), end(v), true) == end(v)) // All false
我也同意在最坏的情况下,必须检查每个元素,但对于所有其他情况,我建议重新表述问题: 我的收藏中的所有元素都相等吗?如果是,价值是多少 这两种情况下都会很早返回,您已经完成了。 否则,还必须检查元素的值(true或false) 对于这一点,我建议看看 我想进一步概括我的答案:这可以用任意N个互斥谓词A1,我想检查一下我的收藏。为此,我需要一个函数,给定集合中的一个元素,该函数返回保留该元素的谓词Ai的一些标识符(以及检查谓词是否相等的方法)
然后,我可以再次应用上述方案。不是真的,除了选择另一个容器,例如
位集
,而是查看任何
和所有
。否。这将惩罚更有用的操作。不过,标准算法可能专门针对您的情况。如果您可以将true\false
视为1\0
,请尝试将其转化为k阶统计量问题。在O(log.n)
time中只查找第一个和最后一个值。如果它们是相同的,你就知道它们都是一个值。在我的记忆中,你实际上需要一个顺序统计树结构来获取O(log.n)
。如果没有专门的结构,它将是O(n)
。如果你真的在寻找最快的方法,那么值得一想,但在其他方面可能会有点过头。更正:“如果all
为false,则至少有一个元素不是true
”。(或者至少有一个元素是false
)@abelenky很好的捕捉:)“照我说的做,不要照我说的做”。。。或者类似的东西。这不会告诉你所有的元素是否都是假的。@Ferruccio Correct,这将类似于Python的all
函数。补码any
将告诉您是否所有元素都是false
,这与此代码类似,但稍作修改。这不会告诉您是否所有元素都是true。@Ferruccio Right。您可以将它与它的大小进行比较:如果(acu..()==v.size())
那么如果我在vec中的所有值都为true,它将返回true?@LoveMeow哪种语法?这只适用于C++11 lambda和算法。对于非C++11,我会检查答案或抱歉,最近一直在使用映射,这适用于映射索引。我将在正确的代码中进行编辑。
if (std::find(begin(v), end(v), true) == end(v)) // All false