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實例,如果它們的範圍重疊,則它們相等。但是,當我嘗試在插入後檢索一個值時,它會給我一些垃圾值作爲主函數輸出。我在這裏做錯了什麼?
映射比較器不測試相等性。地圖比較器實現[嚴格的弱排序](https://en.wikipedia.org/wiki/Weak_ordering)。用簡單的術語:'<'運算符,而不是'=='運算符。 –