2016-03-31 3 views
3

Я новичок в C++.Сравните все элементы std :: vector с любым другим элементом в одном и том же векторе.

Я пытаюсь найти, как итерации через вектор, чтобы сравнить каждый элемент с любым другим элементом, где порядок сравнения не имеет значения где;

(а «по сравнению с» Ь) = (Ь «по сравнению с» а)

Так проверяя один означает, что вам не нужно сравнивать все значения с любым другим значением, как раз остальные из них.

У меня есть что-то похожее на этот ИГРУШИТЕЛЬНЫЙ алгоритм;

#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++) 

часть, которая, я думаю, может быть выполнена более эффективно с использованием лямбда.

Этот подход работает, но;

  • Это самый эффективный способ проведения такого рода итераций?

  • Это может быть сделано как лямбда с использованием зЬй :: for_all()?

Спасибо.

+2

Является ли отношение больше или меньше, чем определено? Если это так, вы можете сортировать списки, и можно будет избежать сравнения всего. –

+0

Не знаю, будет ли это работать ... Я ОСНАСТНО сравниваю строки, которые INTERSECT не являются простыми числами, поэтому я искал обобщенную форму для решение НЕ просто удваивается. –

+0

Вы получите неправильный символ, если вектор содержит три (или более) равных элемента. –

ответ

1

Нет. Вам не нужно тестировать (it1 != it2), потому что по определению вашей петли на it2, it2 всегда будет больше it1. Эффективность будет увеличена, если вы удалите эту фразу из своего кода.

Возможно, вы можете использовать std::for_all, но неясно, что это повысило бы эффективность кода.

+0

Конечно. Понял, что после публикации. –

+0

Понял, что после публикации. Будет редактировать. –

0

Используйте std::set и один цикл, чтобы проверить, существует ли в векторе уже существующее значение; и если не вставить его.

Это действительно то, для чего std::set. Будет сложно найти реализацию поиска, которая будет превосходить std::set.

+0

'std :: sort' может легко превзойти' std :: set' – Slava

+1

std :: lower_bound и std :: binary_search на отсортированном векторе являются двоичными поисками с логарифмической сложностью. Недостатком является то, что вам нужно либо сортировать векторные, либо вставляемые элементы в порядке сортировки (опять же, например, lower_bound), который * может * вызывать перераспределение и копии. Для относительно небольших наборов данных даже линейный поиск (find_if) будет быстрее, чем поиск набора из-за кэширования процессора. –

+0

Это не имеет никакого смысла. Если предикат был отношением эквивалентности, и OP имел доступ к совместимому слабому порядку, он сделал бы намного лучше, просто сортируя данные и сравнивая соседние элементы (без бинарного поиска). – filipos

 Смежные вопросы

  • Нет связанных вопросов^_^