【问题标题】:Using equal(),find() on a vector<complex <double> >在向量上使用 equal(),find()<complex <double> >
【发布时间】:2010-09-24 21:10:45
【问题描述】:

这是一件非常简单的事情,但我一直在努力理解。我正在尝试将vector&lt;complex &lt;double&gt; &gt; vec 的元素与complex &lt;double&gt; 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:我重载了运算符 ==,但 find 无法使用它:

: 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&)’

【问题讨论】:

  • std::find 不返回布尔值 - 它返回一个迭代器。如果迭代器指向 vec.end(),那么你就知道向量中不存在该元素。否则,find 将返回一个指向定位元素的迭代器。

标签: c++ stl find complex-numbers


【解决方案1】:

std::equal 算法用于比较 2 个迭代器范围。因此,您可以使用它来比较例如 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,这样您就可以得到对数复杂度的查找,并自动保证您没有任何重复的元素。

【讨论】:

  • +1 用于在 OP 尝试强制执行唯一性约束时使用 set。
  • 刚刚意识到这已经包含了我的答案 :sigh:。删除了我的答案并 +1。
  • 虽然 std::complex 可以与 operator== 进行比较,但说明比较运算符返回 lhs.real() == rhs.real() && lhs.imag() == rhs.imag()。由于用除浮点类型以外的任何东西实例化 std::complex 是未定义的,我认为这可能会导致常见的浮点比较问题。自定义比较功能不在这里吗?
  • 或者,如果插入相对较少或容器相对较小,排序后的std::vector 可能会提供更好的性能(使用std::binary_search 和朋友)。
  • g++ 编译器一直给我关于编译的错误,说没有匹配的函数来调用复杂的 。它适用于双倍。浮点比较问题也会出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2015-04-21
  • 2014-03-23
  • 1970-01-01
相关资源
最近更新 更多