我是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 完成?
谢谢。
答案 0 :(得分:1)
没有。您不需要对(it1 != it2)
进行测试,因为根据it2
上的循环定义,it2
将始终大于it1
。如果从代码中删除该短语,效率会提高。
你可能可以使用std::for_all
,但不清楚是否会提高代码的效率。
答案 1 :(得分:0)
使用std::set
和单个循环来检查向量中的值是否已存在于集合中;如果没有插入它。
这正是std::set
的用途。很难找到一个优于std::set
的查找实现。