2016-06-01 4 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). В простом выражении: '' 'operator, а не' == 'оператор. –

ответ

5

Компаратор для map должен быть «строгим слабым порядком», то есть не может быть, что Comp (A, B) возвращает true, а Comp (B, A) возвращает true. Ваш компаратор является нарушением этого.

Смежные вопросы