1

カスタムfind()関数を実装するためのクリーンな方法は何ですか?たとえば、operator ==がクラスXの検索で機能し、既存の値に近い変数の値と一致するようにします。

class X{
public:


  double _a;
  double _b;
  double _c;

X(double a, double b, double c){
   _a = a;
   _b = b;
   _c = c;
 }

  bool operator==(const X& other) const
  { 
      if(fabs(other._a - _a) < 0.02) return true;       
      return false;
  }


};

typedef X* ptrX;

std::vector<ptrX> vec;
ptrX t1 = new X(1,2,3);
vec.push_back(t1);
ptrX t = new X(1.01,2,3); 

bool b = (find(vec.begin(),vec.end(),t) == vec.end()); //b should be false 
4

2 に答える 2

1

検索関数は、データではなくポインターを比較します。C ++ 11互換のコンパイラを使用している場合は、代わりに次のことができるはずです。

bool b = std::find_if( vec.begin(), vec.end(), 
    [&]( const ptrX& p ){ return *t == *p; }
) == vec.end();

または、C ++ 11以外の環境の場合:

bool b = std::find_if( vec.begin(), vec.end(), your_deref_equal ) == vec.end();
于 2012-07-07T21:28:56.343 に答える
0

あなたの等価演算子は問題ありません(等価ではないことを除いて、あなたはそれを望んでいます)。ただし、問題は、ベクトルにオブジェクトではなくポインターを格納することです。そのため、比較演算子をまったく使用しません (findどちらかといえば、ポインターが等しいかどうかを比較します)。

あなたはそれを修正することができます

  • オブジェクトをベクターに直接保存する、つまり、スニペットを次のように変更します

    std::vector<X> vec;
    X t1 =  X(1,2,3);
    vec.push_back(t1);
    X t =  X(1.01,2,3); 
    bool b = (find(vec.begin(),vec.end(),t) == vec.end())
    

    これは簡単で機能しますが、場合によっては受け入れられない場合があります (同じオブジェクトをベクトル内で 2 回使用したい場合)。その場合、次のことができます。

  • ベクトルとしてBoost Ponter Container Library を使用ptr_vectorします。これにより、ポインターのコンテナーにより明確なインターフェイスが提供されます。

  • STLアルゴリズムにカスタムコンパレータを提供します。他の回答を参照してください。

于 2012-07-07T21:34:19.403 に答える