在向量<complex <double =“”>&gt; </complex>上使用equal(),find()

时间:2010-09-24 21:10:46

标签: c++ stl find complex-numbers

这是一件相当简单的事情,但我一直在试图理解。我正在尝试将vector<complex <double> > vec的元素与complex <double> num进行比较,以检查vec上是否已存在num。如果是,则不添加。我试图使用equal()和算法,没有成功。有人知道这么做的快捷方式吗?

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 个答案:

答案 0 :(得分:4)

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,因此您可以获得查找的对数复杂度,并自动确保您没有任何重复元素。