2016-06-01 78 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。你的比较是违反了这个。