2016-06-01 116 views
0

我正在嘗試使用用戶定義的類型作爲具有自定義比較器的地圖鍵,如下所示。STL地圖自定義比較器

#include <map> 
#include <iostream> 

class RangeKey { 
    public: 
    int start; 
    int end; 

    RangeKey(int start, int end) : start(start), end(end) { 

    } 

    bool withinRange(int value, bool inclusive) const { 
     if (inclusive) { 
     return (value >= start && value <= end); 
    } else { 
     return (value > start && value < end); 
    } 
    } 

    bool overlapsWith(const RangeKey& r) const { 
    if (r.withinRange(start, true) || 
     r.withinRange(end, true) || 
     (start < r.start && end > r.end)) { 
     return true; 
    } 
    return false; 
    } 

}; 

class RangeKeyComparator { 
    public: 
    bool operator()(const RangeKey& a, const RangeKey& b) const { 
     if (a.overlapsWith(b)) { 
     return true; 
     } else { 
     return a.start < b.start; 
     } 
    } 
}; 

int main() { 
    std::map<RangeKey, int, RangeKeyComparator> m; 
    m.insert(std::pair<RangeKey, int>(RangeKey(1, 2), 1)); 
    auto it = m.find(RangeKey(1, 2)); 

    std::cout << it->first.start << "\n"; 
    std::cout << it->first.end << "\n"; 
    std::cout << it->second << "\n"; 

    return 0; 
} 

這個想法是考慮兩個RangeKey實例,如果它們的範圍重疊,則它們相等。但是,當我嘗試在插入後檢索一個值時,它會給我一些垃圾值作爲主函數輸出。我在這裏做錯了什麼?

+1

映射比較器不測試相等性。地圖比較器實現[嚴格的弱排序](https://en.wikipedia.org/wiki/Weak_ordering)。用簡單的術語:'<'運算符,而不是'=='運算符。 –

回答

5

map的比較器需要是「嚴格弱排序」,即它不可能是Comp(A,B)返回true並且Comp(B,A)返回true。你的比較是違反了這個。