Используя equal (), find () для вектора <complex <double>> - PullRequest
0 голосов
/ 25 сентября 2010

Это довольно простая вещь, но я бился головой, пытаясь понять. Я пытаюсь сравнить элементы vector<complex <double> > vec с complex <double> num, чтобы проверить, существует ли уже num на vec. Если это так, он не добавляется. Я пытался использовать равные () и алгоритм, но безуспешно. Кто-нибудь знает быстрый способ сделать это?

EDIT2: Я пытаюсь сделать это для комплексных чисел в качестве упрощения, поскольку мне также нужно выполнить ту же операцию над структурой:

struct thing{
 int i;
 int j;
 complex <double> pos;
}typedef t_thing;

complex <double> new_num(2.0,2.0);
t_thing will_insert;
will_insert.i = 1;
will_insert.j = 1;
will_insert.pos = new_num;
vector<t_thing> vec_thing;
if(! (find(vec_thing.begin(),vec_thing.end(),will_insert) == vec_thing.end())){
  vec_thing.push_back(will_insert);
}else { 
 cout<<"element already on vec_thing"<<endl;
}

РЕДАКТИРОВАТЬ 3: Я перегружен оператор ==, но найти не может работать с этим:

: error: no matching function for call to ‘find(__gnu_cxx::__normal_iterator<thing*, std::vector<thing, std::allocator<thing> > >, __gnu_cxx::__normal_iterator<thing*, std::vector<thing, std::allocator<thing> > >, t_thing&)’

1 Ответ

4 голосов
/ 25 сентября 2010

Алгоритм std::equal используется для сравнения двух диапазонов итераторов. Таким образом, вы можете использовать его для сравнения, например, 2 векторов, чтобы увидеть, содержат ли оба вектора одинаковые элементы.

В вашем случае, когда вам нужно только проверить, находится ли один элемент внутри вектора, вы можете просто использовать std::find

if (std::find(vec.begin(), vec.end(), std::complex<double>(1,1)) == vec.end()) {
   /* did not find element */
}
else { /* found the element */ }

Обратите внимание, что std::vector не особенно подходит для таких алгоритмов поиска, так как каждый поиск дает вам O (N) сложность. Возможно, вы захотите подумать об использовании std::set, чтобы получить логарифмическую сложность для поиска и автоматическую гарантию того, что у вас нет повторяющихся элементов.

...