2012-03-02 3 views
0

両方のベクトル内に同じオブジェクトのインスタンスのいくつかを持つオブジェクトの2つのベクトルと一致するコードを少し書いています。2つのベクトルの変数の一致と効率的な比較のマップの作成

「main」ベクトルでオブジェクトのインデックスを見つけ、それを他のベクトルのオブジェクトに一致させることです。

メインベクトルのインデックスは、そのオブジェクトを持つマップで使用されます。

私はコードを見ることは私の説明が少し明確にかもしれないと思う:

ifndef OBJECTMAPMATCH_H 
#define OBJECTMAPMATCH_H 

#include <map> 
#include <utility> 
#include <vector> 
#include <typeinfo> 
#include <iostream> 
#include <stdlib.h> 

namespace ObjectMapMatch { 

    ... 
    ... 
    template< class A, class B > 
    std::map<int, B*>* getIndexMap(std::vector<A*>* x , std::vector<B*>* y, std::map<int, B*>* output) 
    { 
     typename std::vector<A*>::iterator Aitr = x->begin(); 
     typename std::vector<A*>::iterator AitrE = x->end(); 
     typename std::vector<B*>::iterator Bitr = y->begin(); 
     typename std::vector<B*>::iterator BitrE = y->end(); 

     for(int index=0; Aitr!=AitrE; ++Aitr, ++index){ 
     //Keep track of original index 
     int AntupIndex = (*Aitr)->Index(); 
     int match = false; 

     for(; Bitr!=BitrE; ++Bitr){ 
      int BntupIndex = (*Bitr)->Index(); 

      if(AntupIndex == BntupIndex){ 
       match = true; 
       output[index] = (*Bitr); 
      } 
      } //End of loop B 

      if(!match){ 
      std::cout << "ERROR:ObjectMapMatch::getIndexMap: Can not Find Match" << typeid(y).name() << " FOR " << typeid(x).name() << std::endl; 
      exit(1); 
      } 

      }//End of Loop A 

      } 

    ... 
    ... 
} 
#endif 

あなたは、私は基本的にそこにユニークインデックスを持つ2つのオブジェクトを比較していますし、これが一致する場合、オブジェクトが一致します見ることができるように。

マイquesitons:

私は、オブジェクトクラスの比較演算子をオーバーロードしている可能性が知っているが、このようなものが正しいだろう場合、私は確認されませんでした?

bool operator==(object1& lhs, object2& rhs){ 
    &lhs == &rhs ? return true : return false; 
} 

また、

は、いくつかのSTLアルゴリズム(ブーストLIBSを使用することはできません)、またはよりスマートなものを使用して上記のコードの短い/より効率的な方法はあります?

マイク

+0

@perreal - これはうまくいくでしょう。 ;-D。これらのオブジェクトを照合するSTL効率化ソリューションに関する考え方。ループの解決策は醜いです... – MWright

+0

一般的な注意:可能であれば、C++のポインタではなく参照によってオブジェクトを渡す必要があります。それはシンタックスを単純化し、受信機がライフサイクルに対して責任を持たないことを明確にします。また、オブジェクトを変更しないときは、constを使うべきです。ほとんどのC++ライブラリはconstの正確さのために設計されており、オブジェクトをconstとして渡すので、あなたのコードはそれがなければ動作しません。 –

+0

上記の例では、メソッドは 'std :: map const&getIndexMap(std :: vector const&x、std :: vector const&y、std :: map &出力)'であり、オペレータは'bool operator ==(object1 const&lhs、object2 const&rhs)'になります。後者は、標準ライブラリがconst参照でそれを呼び出すため、const以外のものを取っている演算子が一致しないためです。もちろん、この 'operator =='は 'Index'メソッドが' const'修飾子で定義されていないとコンパイルされません(invocantが引数リストの後に来る)。 –

答えて

2

より効率的にはO(n^2)よりもこれを行うにはいくつかの方法があります。例えば

:最初のベクトルの

  • 並べ替え要素。
  • 第2ベクトルの要素をソートします。
  • ソートベクターにset_intersectionを使用してください。

または:multiset(またはunordered_multiset)に両方ベクトルの

  • 入れ要素。
  • が複数の要素を持つmultisetのキーが一致することを示します。

これらの方法の両方について、実際の要素の代わりに元のベクトルにポインタまたはインデックスを使用できます。ポインター/インデックスを扱うことができるコンペラー(sortset_intersectionmultiset)を提供するように注意してください。

+0

両方のベクターが同じ条件でソートされます。私はマップ[int、B]にベクトルAのインデックスを格納したいので、set_intersectionが私の問題でどのように機能するかはわかりません。これはベクトルAのどのオブジェクト番号がベクトルBのオブジェクトを参照しているかを知っているからです。それが明確でない場合はごめんなさい – MWright

+0

私が誤解した場合、コード化された例を提供できますか? – MWright

+1

@MWright:ソートされた構造体にインデックスを書き込む必要があります。しかし、私は、インデックスを必要とすることは、コールチェーンのどこか高いほうにある最適ではないデザインの兆候であると強く思っています。実際は、最適ではないデータ構造を使用しているような問題があります。 –

関連する問題