0

これは非常に簡単なことですが、私は理解しようと頭を悩ませてきました。vector<complex <double> >vecの要素をnumと比較して、complex <double>numがvecにすでに存在するかどうかを確認しようとしています。含まれている場合、追加されません。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&)’
4

1 に答える 1

4

この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検討することをお勧めします。これにより、ルックアップの対数の複雑さが得られ、重複する要素がないことが自動的に保証されます。

于 2010-09-24T21:14:55.753 に答える