2016-09-30 9 views
2

私は以前に一度similar questionと尋ねましたが、今は関連する問題があります。以下は出力が「見つからない」で、印刷される要素の数は2です。なぜこのstd :: mapキーが見つからないのですか?

positions.emplace(r,q);行には要素が明示的に挿入されているため、マップのサイズは正しいので、なぜが見つからないのですか? pです(この例ではログに記録されていません)。

#include <map> 
#include <iostream> 

struct screenPoint { 
    float x = 0, y = 0; 
    screenPoint(float x_, float y_): x{x_}, y{y_}{} 
}; 

bool operator<(const screenPoint& left, const screenPoint& right){ 
    return left.x<right.x||left.y<right.y; 
} 

std::map<screenPoint, screenPoint> positions; 

int main(int argc, const char * argv[]) { 

    auto p = screenPoint(593,271.5); 
    auto q = screenPoint(595.5,269.5); 
    auto r = screenPoint(599,267); 
    positions.emplace(p,q); 
    positions.emplace(r,q); 

    auto f = positions.find(r); 

    if (f == positions.end()){ 
    std::cout << "not found"; 
    } else { 
    std::cout << "found"; 
    } 

    std::cout << std::endl; 

    std::cout << "number elements: " << positions.size() << "\n"; 
    return 0; 
} 

答えて

2

あなた比較演算子

bool operator<(const screenPoint& left, const screenPoint& right){ 
    return left.x<right.x||left.y<right.y; 
} 

が間違っています。 if文を使用する必要があります。xが等しい場合、left.yright.y未満の場合はleft.x < right.xを返します。または

bool operator<(const screenPoint& left, const screenPoint& right){ 
    return std::tie(left.x, left.y) < std::tie(right.x, right.y); 
} 
+0

私の他の質問では、私は&&を使用していて、それもうまくいきませんでした。 http://stackoverflow.com/questions/39690503/what-is-this-use-of-stdmap-doing –

+0

@JeromeBaldridge更新されました。 2人のメンバーがいるので、より複雑になります。 – NathanOliver

+0

タイは参照のタプルを作成するだけなので、結果として得られるタプルは自動的に良好な演算子を作成しますか? –

3

operator<は、厳格な弱い注文ではありません。たとえば、p<qq<pの両方があります。これは、任意のmap操作の未定義動作を意味します。 NaNを無視して、有効なoperator<を、提供するために、

一つの方法は、次のようになります。

bool operator<(const screenPoint& left, const screenPoint& right) { 
    return left.x < right.x || 
      (left.x == right.x && left.y < right.y); 
} 
+0

ようstd::tieを使用し、私の他の質問で提供ソリューションは十分ではなかったと思われます。このようなシンプルなデータ構造のために、私はどのように良い演算子を提供できますか? –

+0

'std :: tie()'を使用してください – krzaq

+0

最新の編集で 'operator <'を参照してください。 – aschepler

関連する問題