両方のベクトル内に同じオブジェクトのインスタンスのいくつかを持つオブジェクトの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を使用することはできません)、またはよりスマートなものを使用して上記のコードの短い/より効率的な方法はあります?
マイク
@perreal - これはうまくいくでしょう。 ;-D。これらのオブジェクトを照合するSTL効率化ソリューションに関する考え方。ループの解決策は醜いです... – MWright
一般的な注意:可能であれば、C++のポインタではなく参照によってオブジェクトを渡す必要があります。それはシンタックスを単純化し、受信機がライフサイクルに対して責任を持たないことを明確にします。また、オブジェクトを変更しないときは、constを使うべきです。ほとんどのC++ライブラリはconstの正確さのために設計されており、オブジェクトをconstとして渡すので、あなたのコードはそれがなければ動作しません。 –
上記の例では、メソッドは '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が引数リストの後に来る)。 –