【问题标题】:Fastest way to find out if all elements in a vector are false or true c++?找出向量中的所有元素是假还是真c ++的最快方法?
【发布时间】:2015-01-09 20:06:02
【问题描述】:

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

【问题讨论】:

  • 不是真的,除了选择另一个容器,例如bitset,但请查看 any_ofall_of
  • 没有。这将惩罚更有用的操作。不过,标准算法可能专门针对您的情况。或者不。
  • 如果您可以将true\false 视为1\0,请尝试将其转换为k-th order statistic 问题。仅查找O(log.n) 时间中的第一个和最后一个值。如果它们相同,您就知道它们都是一个值。
  • 重温我的记忆,您实际上需要一个订单统计树结构才能在O(log.n) 中获取这些信息。如果没有专门的结构,它将是O(n)。如果您真的在追求最快的方法,那么值得考虑一下,否则可能会矫枉过正。

标签: c++ vector


【解决方案1】:

我也同意在最坏的情况下必须检查每个单独的元素,但对于所有其他情况,我建议重新表述问题:

我的集合中的所有元素都相同吗?如果有,价值是多少。

这两种情况都会提前返回,您就完成了。 否则,还必须检查元素的值(真或假)。

为此,我建议查看here

我想更概括一下我的答案:这可以通过任何 N 个互斥谓词 A1、...、AN 来完成,我想检查我的集合。为此,我需要一个函数,给定我集合中的一个元素,返回为该元素保留的谓词 Ai 的某个标识符(以及一种检查谓词是否相等的方法)。

那么我又可以应用上述方案了。

【讨论】:

    【解决方案2】:

    我认为最有效的是:

    if(v.find(v.begin(), v.end(), true) == v.end())
    // All false  
    
    if(v.find(v.begin(), v.end(), false) == v.end())
    // All true
    

    【讨论】:

    • 抱歉,最近一直在使用地图,这适用于地图索引。我将在正确的代码中进行编辑。
    【解决方案3】:

    最简单的 IMO 是免费的find 功能

    if (std::find(begin(v), end(v), true) == end(v)) // All false
    

    【讨论】:

      【解决方案4】:

      你也可以使用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
      }
      

      【讨论】:

      • 这不会告诉你是否所有的元素都是真的。
      • @Ferruccio 对。您可以将其与其大小进行比较:if (accu..() == v.size())
      【解决方案5】:

      这需要循环,但至少会利用短路行为。

      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,则向量中的所有元素都为真。如果all 为假,则至少有一个元素不是true

      【讨论】:

      • 更正:“如果all 为假,则至少有一个元素不是true”。 (或至少一个元素是false
      • @abelenky 很好:)“照我说的做,而不是照我说的做”......或类似的东西。
      • 这不会告诉你是否所有元素都是假的。
      • @Ferruccio 正确,这类似于 Python 的 all 函数。补码 any 会告诉您是否所有元素都是 false,这将类似于此代码,但稍作修改。
      【解决方案6】:

      为了清晰起见,我会利用新算法:

      // 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; });
      

      如果不实际检查向量中的每个元素,您将无法确定向量中的所有元素是否为真。最好的情况是,您以不同的方式重新解释内存并一次检查多个元素,但您仍然必须检查所有内容,直到找到一个未通过测试的元素。

      【讨论】:

      • 所以如果我在 vec 中的所有值都为真,它返回真?
      • @LoveMeow 哪种语法?这仅适用于 C++11 lambda 和算法。对于非 C++11,我会查看 Cyber's 答案或 MSalters'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      相关资源
      最近更新 更多