2016-07-03 18 views
1
/** 
* Definition for an interval. 
* struct Interval { 
*  int start; 
*  int end; 
*  Interval() : start(0), end(0) {} 
*  Interval(int s, int e) : start(s), end(e) {} 
* }; 
*/ 
class SummaryRanges { 
public: 
    SummaryRanges() { 

    } 

    void addNum(int val) { 
     auto it = st.lower_bound(Interval(val, val)); 
     int start = val, end = val; 
     if(it != st.begin() && (--it)->end+1 < val) it++; 
     while(it != st.end() && val+1 >= it->start && val-1 <= it->end) 
     { 
      start = min(start, it->start); 
      end = max(end, it->end); 
      it = st.erase(it); 
     } 
     st.insert(it,Interval(start, end)); 
    } 
private: 
    struct Cmp{ 
     bool operator()(const Interval& a, const Interval& b) { return a.start < b.start;} //works 
//  bool operator()(Interval& a, Interval& b) { return a.start < b.start;} //error 
//  bool operator()(Interval a, Interval b) { return a.start < b.start;} //works 
    }; 
    set<Interval, Cmp> st; 
}; 

Ich möchte Objekte von benutzerdefinierten Klasse Interval in std::set sortiert werden. Die Argumente in operator()() können entweder Wert oder const Referenz sein. Aber es würde einen folgenden Fehler melden, wenn der Verweis auf die Argumente nicht übergeben wird.Pass von Wert vs nicht konstante Referenz vs konstante Referenz in Vergleichsfunktion

required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = Interval; _Val = Interval; _KeyOfValue = std::_Identity<Interval>; _Compare = SummaryRanges::Cmp; _Alloc = std::allocator<Interval>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<Interval>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::key_type = Interval]’ 

Warum in std::set nicht const Bezug nicht vorbei scheitern?

+0

"Aber es würde Fehler melden" - was Sie in Ihren Fragebeitrag aufnehmen sollten, wie der Inhalt wohl beschreibt (wenn auch etwas kryptisch für einen Anfänger) was * eigentlich * falsch ist. 'std :: set' sendet const-Referenzen zu Ihrem Komparator, was nicht funktioniert, wenn der Komparator nicht-konstante Referenzen benötigt. Sie können änderbare Referenzen an eine Funktion senden, die unveränderliche Referenzen anfordert. das Umgekehrte ist * nicht * der Fall. – WhozCraig

+0

Ich habe den Fehlerbericht hinzugefügt, danke! – Presley

Antwort

1

std::set Werte sind unveränderlich und sind im Wesentlichen const. Darüber hinaus nehmen alle Mitgliedsfunktionen, die l-Wert-Referenzen verwenden, const Bezug. const Werte können nicht an die Nicht-const-Referenzen gebunden werden, und Sie können keinen konstanten Referenzparameter an das nicht-konstante Vergleichsfunktionsargument übergeben.