将std :: vector的所有元素与同一向量中的每个其他元素进行有效比较

时间:2016-03-31 16:25:32

标签: c++ c++11 lambda stdvector

我是C ++的新手。

我正试图找到如何迭代一个向量来比较每个元素与每个其他元素,其中比较顺序无关紧要;

  

(a'与'b比较)=(b'与'a'相比)

因此,检查一个意味着您不需要将每个值与每个其他值进行比较,只需将剩余的值进行比较。

我有一些像这个TOY算法的东西;

#include <vector>

typedef std::vector<double> vector_t;

int countTheFoo(const vector_t &v)
{
  int fooFound {0};
  for (auto it1 = v.begin(); (it1 != v.end()); it1++)
  {
    for (auto it2 = it1.next(); (it2 != v.end()); it2++)
    {
      if testForFoo(*it1, *it2)
      {
        // Woot! Found some...
        fooFound++;
      }
    }
  }
  return fooFound;
}

vector_t foo { 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 };

int numFoo {countTheFoo(foo)};

我实际上是在比较线条以找到不是简单双打的线条,但技术会相同。

这是;

for (auto it2 = it1.next(); (it2 != v.end()); it2++)

我认为可以使用lambdas更有效地完成部分。

这种方法有效,但是;

  • 这是进行此类迭代的最有效方式吗?

  • 是否可以使用 std :: for_all()作为 lambda 完成?

谢谢。

2 个答案:

答案 0 :(得分:1)

没有。您不需要对(it1 != it2)进行测试,因为根据it2上的循环定义,it2将始终大于it1。如果从代码中删除该短语,效率会提高。

可能可以使用std::for_all,但不清楚是否会提高代码的效率。

答案 1 :(得分:0)

使用std::set和单个循环来检查向量中的值是否已存在于集合中;如果没有插入它。

这正是std::set的用途。很难找到一个优于std::set的查找实现。