2012-08-23 18 views
8

私はセットを使用しています。私はカスタム構造体をキーとして使用します。私は値を挿入して、挿入された値を見つけようとしています。しかし、要素を見つけることは決してないようです。C++ std :: set Find関数オーバーロード==演算子

==演算子と<演算子の両方をオーバーライドしました。ここで

は、構造体のコードです:

struct distance_t 
{ 
public: 
int id; 
double distance; 

bool operator<(const distance_t& rhs) const 
{ 
    if(distance < rhs.distance) 
     return true; 
    else 
     return false; 
} 

bool operator==(const distance_t& rhs) 
{ 
    if(id == rhs.id) 
     return true; 
    else 
     return false; 
} 
}; 

そして、これはそれが常にassert文に失敗した主な

int main() 
{ 
    set<distance_t> currentSet; 

    distance_t insertDistance; 
    insertDistance.id =1; 
    insertDistance.distance = 0.5; 

    currentSet.insert(insertDistance); 

    distance_t findDistance; 
    findDistance.id = 1; 

    assert(currentSet.find(findDistance) != currentSet.end()); 
} 

のコードです。私は間違って何をしていますか?

編集 - 今、私は==演算子を全く使用しないことを理解しています。ここに私が欲しいものがあります。データ構造を距離順に並べる必要があります。しかし、私はIDを使用してそれを削除することができるはずです。これを行うためのクリーンな方法や既存のデータ構造はありますか?

+2

スタイル提案: 'if(expr)return true;それ以外の場合はfalseを返します。 'return expr;'を単に行うことができます。 – Blastfurnace

+1

'return id

+0

@Blastfurnace括弧は必要ありません。 –

答えて

8

あなたのより少なくより比較はあなたがfindDistanceに設定されていない、distance_t::distanceを使用していますので、それは失敗します。

distance_t findDistance; 
findDistance.id = 1; 

std::set何のためにoperator==を使用していません。それはoperator<のみを使用します。したがって、distance_t::idを使用するロジックを変更する必要があります。

あなたがセットの順序を変更することなく、idで検索する場合は、std::findを使用することができます。

set<distance_t>::iterator it = std::find(currentSet.begin(), 
             currentSet.end(), 
             findDistance); 

これはあなたのoperator==を使用します。これには線形時間の複雑さがあることに注意してください。

+0

私は要素を順序付けるために距離を使用したいが、要素を見つけるためにIDを必要とする。それはまったく可能ですか? –

+1

@FhealingDutchmanの順序付けがルックアップに使用されます(セットはバイナリツリーです)。したがって、順序付けと参照を切り離すことはできません。あなたは注文ロジックに 'id'を組み込むことができます。本当にあなたが達成しようとしているものに依存します。 – juanchopanza

+1

@ TheFlyingDutchman '演算子<'を距離で見ることができ、等しい場合はidを見ます。それはあなたが探している順序を維持するでしょう。 (また、両方のフィールドを見るために 'operator =='を変更します。)しかし、それはあなたがidだけを持っていれば検索できないということです。 – hvd

4

operator==はまったく呼び出されないためです。言い換えれば

!(a < b) && !(b < a) 

が、それはoperator<を使用していますが同様の要素を比較することです。

1

findDistance.distanceに値を割り当てていないため、比較結果の比較結果は未定義です。

結果が矛盾するdistance_tのインスタンスを定義することは容易であるため、等価演算子と比較演算子の定義が危険であることに注意してください。 1つの例は、同じ距離であるが異なるIDの2つのインスタンスである。

関連する問題