8

セットを使用しています。キーとしてカスタム構造体を使用します。値を挿入して、挿入された値を見つけようとしています。しかし、それは要素を見つけることは決してないようです。

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

構造のコードは次のとおりです。

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;
}
};

そしてこれはメインのコードです

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());
}

常にassertステートメントで失敗します。私は何が間違っているのですか?

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

4

3 に答える 3

8

未満の比較ではdistance_t::distance、設定していないを使用しているため、失敗しfindDistanceます。

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==。これには線形の時間計算量があることに注意してください。

于 2012-08-23T07:46:33.697 に答える
4

operator==まったく呼び出されないためです。要素の比較は次のようになります。

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

つまり、を使用しますoperator<

于 2012-08-23T07:49:17.700 に答える
1

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

distance_t結果が一貫していないインスタンスを定義するのは簡単なので、等式演算子と比較演算子未満の定義は危険であることに注意してください。1つの例は、距離は同じでIDが異なる2つのインスタンスです。

于 2012-08-23T07:49:57.547 に答える