以下に定義されているように、非常に単純な構造のマッピングを使用しています。
struct mapping{
int code;
string label;
bool operator<(const mapping& map) const {
return code < map.code;
}
bool operator==(const mapping& map) const {
return label.compare(map.label) == 0 ;
}
};
コードで並べ替えられた一連のマッピングを作成したいと思います。そのために、< 演算子をオーバーロードしました。それは正常に動作します。問題なく、ラベルの異なるいくつかのマッピングを挿入できます。
同じコードでラベルが異なるマッピングを挿入しようとすると、問題が発生します。実際、プロセスの 2 番目のステップでは、同じラベルのマッピングが以前に挿入されたかどうかはわかりません。そのため、find() 関数を呼び出して、該当するかどうかを判断する必要があります。同じラベルのマッピングが挿入されていない場合は、問題ありません。この新しいマッピングを挿入するだけです (ただし、そのコードは一時的に他のマッピングと同じになります)。同じラベルのマッピングが 1 つ存在する場合は、そのコードを更新するだけです。私が行ったように == 演算子をオーバーロードするだけで十分だと思いますが、次のコードに示すようにそうではありません。
mapping m = {1,"xxx"};
mapping m2 ={1, "yyy"};
this->fn[0].insert(m);
set<mapping>::iterator itTmp;
itTmp = this->fn[0].find(m2);
if (itTmp != this->fn[0].end() ) {
cout << "m2 exists "<<endl;
if ( !(*itTmp == m2) ){
cout << "But it is different according to the definition of the == operator "<<endl;
}
}
関連する出力は次のとおりです。
m2 exists
But it is different according to the definition of the == operator
この問題を解決し、演算子 < と == を非常に異なるセマンティクスで処理するにはどうすればよいですか? 理想的には、セット全体を反復して同じラベルのマッピングを探すことは避けたいと思います。このような戦略の複雑さは O(n) であり、n は私のアプリケーションでは非常に大きくなる可能性があります。find() の複雑さと同様に、私は O(log n) での解決策を好みます。
ありがとう、
ヨアン