【问题标题】:Test if all elements of a vector are equal测试向量的所有元素是否相等
【发布时间】:2013-03-10 00:03:44
【问题描述】:

我想测试一个非空向量是否包含相同的元素。这是最好的方法吗?

count(vecSamples.begin()+1, vecSamples.end(), vecSamples.front()) == vecSamples.size()-1;

【问题讨论】:

  • 这很简单,当然,但如果它们不同,则效率低下。另外,您可以通过删除 +/- 1 来进一步简化它。特别是因为这会在空向量上爆炸。
  • vecSamples.front() 会在空向量上爆炸。
  • 在我的情况下,向量永远不会为空。
  • 你的向量是否总是至少有 2 个元素?
  • 不,有问题吗?

标签: c++


【解决方案1】:

如果您的向量包含至少一个元素:

std::equal(vecSamples.begin() + 1, vecSamples.end(), vecSamples.begin())

【讨论】:

    【解决方案2】:

    正如@john 正确指出的那样,即使前两个元素不同,您的解决方案也会遍历整个容器,这非常浪费。

    一个纯粹的 no-boost 不需要 c++11 的解决方案怎么样?

    bool allAreEqual = 
      find_if(vecSamples.begin() + 1, 
        vecSamples.end(), 
        bind1st(not_equal_to<int>(), vecSamples.front())) == vecSamples.end();
    

    在找到第一个不相等的元素时停止。 在运行之前确保你的 vecSamples 是非空的。

    【讨论】:

      【解决方案3】:

      在 c++11(或Boost Algorithm)中

      std::all_of(vecSamples.begin()+1,vecSamples.end(),
                [&](const T & r) {return r==vecSamples.front();})
      

      【讨论】:

      • 我知道 OP 正在询问 non-empty 向量这一事实。即便如此,我认为在调用std::all_of() 之前将!vecSamples.empty() || 添加到您的表达式中不会损害您的答案。你怎么看?
      • 在对std::all_of() 的调用中仅将vecSamples.begin()+1 替换为vecSamples.begin() 也使您的代码适用于使用空向量,因为不会在空向量上评估谓词。
      【解决方案4】:

      可能不会,因为它总是检查向量的所有元素,即使前两个元素不同。我个人只会写一个 for 循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        相关资源
        最近更新 更多